【发布时间】:2017-12-08 01:44:22
【问题描述】:
我试图在下面的代码示例中模拟我的问题。在下面的代码中,我在一个过程中执行delete from test2。这很好用:
但是,在我的例子中,这个delete 是一个相当复杂的 CTE 的一部分,有几个更新和插入(没有选择,所以我添加了一个虚拟的 select 1 作为主查询)。让我们模拟一下:
with my_cte as(delete from test2) select 1
现在,我们知道,我们必须使用 perform 关键字来执行此操作:
perform (with my_cte as(delete from test2) select 1);
我收到以下错误:
ERROR: WITH clause containing a data-modifying statement must be at the top level
这是plpgsql的限制吗?
(请注意,这只是解释我的问题的一个示例。我知道这些查询没有任何意义。)
create table test
(
key int primary key
);
create table test2
(
key int primary key
);
create function test() returns trigger as
$$
begin
raise notice 'hello there';
-- this does work
delete from test2;
-- this doesn't work
perform (with my_cte as(delete from test2) select 1);
return new;
end;
$$
language plpgsql;
create trigger test after insert on test for each row execute procedure test();
insert into test(key) select 1;
【问题讨论】:
-
postgresql.org/message-id/… 你读过上面的帖子吗?我会说这是一个限制。如果您愿意分享真正的问题会更容易 - 也许有一个更简单的解决方案,然后执行 CTW 与数据操作
-
我使用 CTE 的原因:我确实可以有几个单独的 INSERT、DELETE、UPDATE 查询,但是在 CTE 之间传递结果并在最后返回 ...的查询。另一种方法是在 plpgsq 过程中获取数据并存储在本地数据结构中,以便在以下查询中使用它。
-
因此,在我看来,这些查询并不是真正的
useless,如您的邮件链接中所述。顺便谢谢你的链接!
标签: postgresql plpgsql common-table-expression