调用带SYS_REFCURSOR输出参数的PL/SQL函数报值过多错误如何解决
错误原因
- 你调用函数的写法存在错误:
fn_test是带3个OUT参数、返回值为NUMBER类型的存储函数,使用SELECT fn_test(...) INTO 多变量的逻辑不成立:该SELECT语句仅能获取函数的RETURN返回值(单个数值),你在INTO后写了3个变量,单个返回值和3个变量数量不匹配,因此抛出值过多的报错。 - 额外的冗余变量问题:你定义的
l_cursor1、l_po_mesg_id_op、l_po_mesg_text_op都是冗余的,OUT参数的值会直接写入你传入的l_cursor、l_po_mesg_id、l_po_mesg_text变量中,不需要额外定义变量接收。
正确修改后的代码
DECLARE l_cursor SYS_REFCURSOR; l_col1 VARCHAR2(2000); l_col2 VARCHAR2(2000); l_col3 NUMBER; l_po_mesg_id NUMBER; l_po_mesg_text VARCHAR2(2000); l_func_return NUMBER; -- 用来接收函数的返回值 BEGIN -- 直接调用函数,不需要套SELECT FROM dual l_func_return := fn_test( 'w', l_cursor, l_po_mesg_id, l_po_mesg_text ); -- 打印函数返回值和两个OUT参数 DBMS_OUTPUT.PUT_LINE('函数返回值:' || l_func_return); DBMS_OUTPUT.PUT_LINE('po_mesg_id:' || l_po_mesg_id); DBMS_OUTPUT.PUT_LINE('po_mesg_text:' || l_po_mesg_text); -- 遍历游标打印内容 DBMS_OUTPUT.PUT_LINE('游标查询结果:'); LOOP FETCH l_cursor INTO l_col1, l_col2, l_col3; EXIT WHEN l_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(l_col1 || ' | ' || l_col2 || ' | ' || l_col3); END LOOP; CLOSE l_cursor; END; /
输出说明
运行上述代码后会依次输出:
- 函数内部打印的Prepared Stmt语句
- 函数的返回值(正常执行为0,异常为2)
- po_mesg_id、po_mesg_text两个OUT参数的值
- 游标返回的查询结果:
1 | 2 | 3
内容的提问来源于stack exchange,提问作者user1720827
相关产品推荐
相关产品推荐

