Cursor返回空集?PostgreSQL函数执行无结果问题咨询
解决PostgreSQL游标函数在pgAdmin中返回空结果的问题
问题原因
在pgAdmin中执行原脚本时,要么是语句未在同一事务内执行(导致游标失效),要么是pgAdmin默认只展示最后一条语句的输出(close a;和commit;无结果返回),所以看不到预期的1,2,3行数据。
调整方案
方案一:确保事务内语句作为整体执行,并调整语句顺序
将整个事务脚本选中后一次性执行,同时把fetch all from a;作为事务内最后一个有输出的语句:
create OR replace function xtest(inout rc refcursor) language plpgsql as $$ begin open rc for select unnest('{1,2,3}'::int2[]) id; end; $$; begin; select * from xtest('a'); fetch all from a; commit;
操作步骤:在pgAdmin查询编辑器中选中所有代码,点击执行按钮(不要逐行运行),此时fetch语句的结果会被正常显示。
方案二:使用CALL语句调用函数(PostgreSQL 11+)
对于带INOUT游标参数的函数,PostgreSQL 11及以上版本支持用CALL调用,pgAdmin会自动解析并返回游标中的结果,无需手动执行fetch:
create OR replace function xtest(inout rc refcursor) language plpgsql as $$ begin open rc for select unnest('{1,2,3}'::int2[]) id; end; $$; begin; call xtest('a'); commit;
执行这段代码后,pgAdmin会直接展示游标中的1,2,3行数据。
方案三:修改函数为直接返回结果集(更简洁)
如果不需要手动操作游标,可以将函数改为返回setof int2类型,调用时直接获取结果:
create OR replace function xtest() returns setof int2 language plpgsql as $$ begin return query select unnest('{1,2,3}'::int2[]) id; end; $$; select * from xtest();
这种方式无需事务和游标操作,更直观,在pgAdmin中执行后直接返回预期结果。
内容的提问来源于stack exchange,提问作者user1889017
相关产品推荐
相关产品推荐

