我尝试在下面的代码示例中模拟我的问题。在下面的代码中,我在过程中执行select * from test。众所周知,我们必须为此使用perform关键字。这很好用:

perform * from test;

但是,如果我尝试将该简单查询重写为CTE,则无法正常运行。我收到语法错误。
with test_as_cte as(select * from test) perform * from test_as_cte;

这可能吗?正确的语法是什么?我尝试了几种替代方法并仔细阅读了文档,但到目前为止没有任何成功。

(请注意,这只是一个解释我的问题的示例。我知道查询实际上没有任何意义。)
create table test
(
    key int primary key
);

create function test() returns trigger as
$$
begin
    raise notice 'hello there';
    -- this does work
    perform * from test;
    -- this doesn't work
    with test_as_cte as(select * from test) perform * from test_as_cte;
    return new;
end;
$$
language plpgsql;

create trigger test after insert on test for each row execute procedure test();

insert into test(key) select 1;

最佳答案

尝试:

perform (with test_as_cte as(select * from test) select * from test_as_cte);

我从不认为您可能需要CTE并忽略结果,但是如果需要,将执行视为“选择不返回”逻辑会导致上述语义。或perform * from (CTE)或类似

关于postgresql - 具有PERFORM CTE查询的Postgres plpgsql,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44906375/

10-15 20:40