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

调用带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:30:01