我有这段代码
create or replace function foo(text)returns int as $$ begin
copy (select * from (delete from bar a where a.id not in(select b.id from bar b where a.id=b.id limit 32 offset 0) returning *) as g) to '/home/foo/.bar.data';
return 1;
end $$ language plpgsql cost 50;
但它无法创建函数并出现以下错误
ERROR: syntax error at or near "from"
LINE 4: copy(select * from(delete from bar a ...
^
********** Error **********
ERROR: syntax error at or near "from"
SQL state: 42601
Character: 29
删除命令(delete from bar ...)
在我单独调用时已准备好并运行完毕
我也试过这个(没有选择),同样的错误。
copy (delete from bar a where a.id not in(select b.id from bar b where a.id=b.id limit 32 offset 0) returning *) to '/home/foo/.bar.data';
我想要的只是从表中删除并复制到文件中 另外我怎样才能在pgsql中使用void方法?
答案 0 :(得分:0)
看看这个: Using return value from DELETE for UPDATE in Postgres
接受的答案可能会指向正确的方向。看来在子查询中使用DELETE
存在一些固有的PostgreSQL限制,可能会延伸到COPY
。链接的问题专门讨论了在DELETE
中使用UPDATE
结果的复杂性,但提供的解决方法也适用于您的用例。
答案 1 :(得分:0)
您不能像这样使用COPY,因为语法不支持使用子查询。而且file_fdw
是只读的,因为我知道,所以这也可以。
可能起作用的是:
create temporary table ... as
delete from ... returning *;
...然后copy
临时表到文件。