首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres 11 -事务处理后的获取结果

Postgres 11 -事务处理后的获取结果
EN

Database Administration用户
提问于 2018-07-01 03:40:14
回答 2查看 1.1K关注 0票数 4

Postgres 11的最新更新。它现在支持程序。Postgres中的存储过程最终支持事务。但是,我一直试图执行一个事务,并作为结果检索一个反射游标。

代码语言:javascript
复制
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$

我知道,获取回游标必须在事务中。我就是这样执行这个过程的。

代码语言:javascript
复制
BEGIN;
Call oureadata.testproc('1','2','');
fetch all in cur;
commit;

当我试图获取游标时,它会抛出一个异常“错误:无效的事务终止”。

但如果我把提交从程序中删除。实际上,我可以执行这个过程,并获取重新游标的结果。(以上只是一个例子,因为我还有其他更复杂的事务,它们将在后面返回recur标)

因此,我的问题是,在事务完成后,一个过程是否能够返回INOUT Refl游标结果?

EN

回答 2

Database Administration用户

发布于 2019-05-07 12:11:31

据我所知,为了在过程结束后使用游标,您需要在调用过程时处理相同的事务。您的代码使用两个不同的事务:第一个事务是在调用过程之前用BEGIN启动的,它以COMMIT结束。第二个事务在过程中的COMMIT之后自动启动,然后继续到FETCH之后的COMMIT

票数 1
EN

Database Administration用户

发布于 2019-09-23 21:03:35

我编写了一个bash脚本,使用PSQL执行我的SQL脚本,从而满足了在同一事务上工作的要求。好像没问题。https://stackoverflow.com/a/58022481/494635

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/211057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档