使用PERFORM CTE查询Postgres plpgsql

时间:2017-07-04 12:45:06

标签: postgresql plpgsql common-table-expression database-trigger

我试图在下面的代码示例中模拟我的问题。在下面的代码中,我在一个过程中执行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;

1 个答案:

答案 0 :(得分:5)

尝试:

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

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