Oracle存储过程中SYS_REFCURSOR打印报错问题求助
问题原因与解决办法
错误根源
你遇到的ORA-24338: statement handle not executed和SP2-0625错误,核心原因是存储过程里提前关闭了输出游标。
在你的包体代码中,打开游标后立刻执行了CLOSE br_out_rec;:
OPEN br_out_rec FOR SELECT * FROM DUAL; CLOSE br_out_rec;
OUT类型的SYS_REFCURSOR设计目的是将游标传递给调用方,由调用方(比如你用的print命令)来读取数据并最终关闭游标。过程内部关闭游标后,调用方拿到的是一个已关闭的无效游标,自然无法执行读取操作。
修复方案
直接删除存储过程中的CLOSE br_out_rec;语句,修改后的包体代码如下:
CREATE OR REPLACE PACKAGE BODY tabula.gettorim AS PROCEDURE liorbybranch ( br_out_rec OUT SYS_REFCURSOR ) IS BEGIN EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-mm-yyyy'''; OPEN br_out_rec FOR SELECT * FROM DUAL; -- 移除CLOSE语句,让调用方处理游标关闭 END liorbybranch; END gettorim; /
重新编译包体后,再执行原有调用语句:
variable br_out_rec refcursor; DECLARE BEGIN TABULA.gettorim.liorbybranch(:br_out_rec); END; / print br_out_rec
此时游标会保持打开状态,print命令可以正常读取并输出游标内容,执行完成后Oracle会自动管理游标关闭。
补充说明
ORA-01001 Invalid Cursor错误本质也是游标状态异常导致的,和本次的错误根源一致——操作了无效(已关闭)的游标。- 对于输出型游标,始终遵循“打开游标在过程内,关闭游标在调用方”的原则,避免出现游标状态不匹配的问题。
内容的提问来源于stack exchange,提问作者liorke
相关产品推荐
相关产品推荐

