如何编写匿名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
相关产品推荐
相关产品推荐

