Postgres 11的最新更新。它现在支持程序。Postgres中的存储过程最终支持事务。但是,我一直试图执行一个事务,并作为结果检索一个反射游标。
CREATE OR REPLACE PROCEDURE testproc(pid text,pname text,INOUT cresults refcursor)
LANGUAGE plpgsql
AS $procedure$
BEGIN
cresults:= 'cur';
begin
update "testtable" set id=pid , name=pname where id=pid;
commit;
end;
OPEN cresults for select * from oureadata.CMS_CATEGORY limit 1;
end;
$procedure$我知道,获取回游标必须在事务中。我就是这样执行这个过程的。
BEGIN;
Call oureadata.testproc('1','2','');
fetch all in cur;
commit;当我试图获取游标时,它会抛出一个异常“错误:无效的事务终止”。
但如果我把提交从程序中删除。实际上,我可以执行这个过程,并获取重新游标的结果。(以上只是一个例子,因为我还有其他更复杂的事务,它们将在后面返回recur标)
因此,我的问题是,在事务完成后,一个过程是否能够返回INOUT Refl游标结果?
发布于 2019-05-07 12:11:31
据我所知,为了在过程结束后使用游标,您需要在调用过程时处理相同的事务。您的代码使用两个不同的事务:第一个事务是在调用过程之前用BEGIN启动的,它以COMMIT结束。第二个事务在过程中的COMMIT之后自动启动,然后继续到FETCH之后的COMMIT。
发布于 2019-09-23 21:03:35
我编写了一个bash脚本,使用PSQL执行我的SQL脚本,从而满足了在同一事务上工作的要求。好像没问题。https://stackoverflow.com/a/58022481/494635
https://dba.stackexchange.com/questions/211057
复制相似问题