postgresql - 如何从 PostgreSQL 12.5 版本的存储过程中获取多个结果集?
问题描述
表创建
CREATE TABLE schname.newtable ( id serial NOT NULL,
username varchar(100) NULL,
inserted_on varchar NULL DEFAULT now() );
程序创建
CREATE OR REPLACE PROCEDURE schname.pr_insertion(p_type integer, p_name character varying, INOUT p_cur refcursor DEFAULT 'kkk'::refcursor)
LANGUAGE plpgsql
AS $procedure$
declare
err_context text;
begin
begin
if p_type = 1 then
insert into schname.newtable (username) values (p_name) ;
open p_cur for select id, username, inserted_on FROM schname.newtable ;
end if ;
exception
when others then
rollback;
GET STACKED DIAGNOSTICS err_context = PG_EXCEPTION_CONTEXT;
RAISE INFO 'Error Name:%',SQLERRM;
RAISE INFO 'Error State:%', SQLSTATE;
RAISE INFO 'Error Context:%', err_context;
insert into schname.lms_proc_error_log (function_name, ptype, module1, error_number, error_state, error_context)
select 'pr_insertion', p_type, 'Login-check', cast(sqlerrm as varchar) , cast(sqlstate as varchar) , err_context ;
open p_cur for
select sqlerrm || ' fail' || err_context as status ;
end;
commit;
end ;
$procedure$
;
在查询窗口中执行/调用上述存储过程时出现以下错误
call schname.pr_insertion(1, 'h') ;
FETCH ALL FROM "kkk" ;
错误:SQL 错误 [34000]:错误:游标“kkk”不存在
注意:如果我在查询下方运行记录正在插入,但我们无法获取结果集
call schname.pr_insertion(1, 'h') ;
FETCH ALL FROM "kkk" ;
解决方案
游标仅在事务期间存在,因此您必须将两个语句包装在事务中:
BEGIN;
CALL schname.pr_insertion(1, 'h');
FETCH ALL FROM kkk;
COMMIT;
此外,像您正在做的那样使用相同的光标来显示错误消息并不是一个聪明的主意。使用函数并将消息作为函数结果,或者INOUT
为消息使用另一个参数。
推荐阅读
- javascript - 我正在尝试通过句柄更改 useState 对象
- android - 当我的活动中有零代码时,微调器正在泄漏
- javascript - 在按钮上单击停止计数器值并获取相应的值
- asp.net-core - 我应该向我的客户提供什么来在任何地方部署 Asp.Net Core?
- pyspark - 使用表名读取增量表版本
- python - TypeError:维度值必须是整数或无或具有 __index__ 方法,得到值'TensorShape([None,16])'
- c++ - Makefile 导致致命错误:没有这样的文件或目录
- javascript - 如何使用 Spring JPA 和 JQUERY ajax 构建和发送实体?
- flutter - Flutter2 升级:为什么 build_runner 包不是空安全的
- java - Hibernate SQLQuery.list() 获取大量记录时非常慢