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

如何编写匿名PL/SQL块调用接收PL/SQL表的包存储过程

测试接收PL/SQL表并返回SYS_REFCURSOR的存储过程的匿名PL/SQL块

没问题,我帮你写一个完整的匿名PL/SQL块来测试这个存储过程。根据你给出的类型和包定义,下面的代码可以直接用来填充PL/SQL表、调用存储过程,还能把返回的游标结果打印出来:

SET SERVEROUTPUT ON; -- 在SQL*Plus/SQL Developer中开启输出

DECLARE
    l_input_rec     rec_arr; -- 声明输入的PL/SQL表变量
    l_output_cursor SYS_REFCURSOR; -- 声明接收输出游标的变量
    v_fname         VARCHAR2(10); -- 存储游标返回的fname字段
    v_lname         VARCHAR2(10); -- 存储游标返回的lname字段
BEGIN
    -- 填充PL/SQL表:直接使用构造函数批量添加数据
    l_input_rec := rec_arr(
        rec_typ('John', 'Doe'),
        rec_typ('Jane', 'Smith'),
        rec_typ('Bob', 'Brown')
    );

    -- 调用存储过程,传入PL/SQL表并接收输出游标
    get_emp_pkg.get_emp(l_rec => l_input_rec, p_out => l_output_cursor);

    -- 遍历输出游标,打印结果
    LOOP
        FETCH l_output_cursor INTO v_fname, v_lname;
        EXIT WHEN l_output_cursor%NOTFOUND;
        
        DBMS_OUTPUT.PUT_LINE('First Name: ' || v_fname || ', Last Name: ' || v_lname);
    END LOOP;

    -- 关闭游标(虽然PL/SQL结束时会自动关闭,但显式关闭是好习惯)
    CLOSE l_output_cursor;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error occurred: ' || SQLERRM);
        -- 如果游标已打开,异常时关闭它
        IF l_output_cursor%ISOPEN THEN
            CLOSE l_output_cursor;
        END IF;
END;
/

代码说明:

  • 变量声明:我们声明了对应输入类型的PL/SQL表变量、接收输出游标的变量,以及用来存储游标每行数据的字段变量。
  • 填充PL/SQL表:使用rec_arr和rec_typ的构造函数一次性批量添加数据,这种方式比逐个EXTEND添加更简洁高效。
  • 调用存储过程:按参数名传递输入和输出参数,避免参数顺序错误的问题。
  • 遍历游标:通过LOOP和FETCH读取游标中的每一行数据,并用DBMS_OUTPUT.PUT_LINE打印出来,方便你验证返回结果是否符合预期。
  • 异常处理:捕获所有异常并打印错误信息,同时确保游标在异常情况下也能被正确关闭,避免资源泄漏。

使用注意:

如果你是在SQL*Plus或者Oracle SQL Developer中运行这段代码,记得先执行SET SERVEROUTPUT ON;,否则看不到DBMS_OUTPUT的打印结果。

内容的提问来源于stack exchange,提问作者oradbanj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:49:12