You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:15:13