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

Oracle SQL Developer打印存储过程CLOB输出参数报错求助

问题描述

我有一个带有CLOB类型输出参数的Oracle存储过程,尝试在SQL Developer中执行该存储过程并将约1.5MB的输出内容打印到DBMS_OUTPUT中。存储过程运行正常,但输出无法打印,错误出现在输出语句中。请问如何打印该输出参数?是否是输出窗口发生了缓冲区溢出?

示例存储过程
create or replace procedure "sp_get_clob_data"
(
p1 varchar2, 
p2 varchar2,
p3 out clob
) as
begin
declare v_p1 varchar2(30);
declare v_p2 varchar2(30);
declare i_num integer;
begin
v_p1 := p1;
v_p2 := p2;
i_num := 3000;

FOR p_num in 1..i_num
LOOP

    p3:= p3 || CHAR(10) || TO_CHAR(p_num) || ": " || v_p1 || ' ' || v_p2;

end loop;

end;
end sp_get_clob_data;
尝试执行的代码
declare csv_output clob;
begin
    sp_get_data('TEST', 'LINE', csv_output);
    declare 
    vClob CLOB := csv_output;
    vPos number;
    vLen number;
    begin
        vLen := DBMS_LOB.GetLength(vClob);
        vPos := 1;
        while vPos < vLen 
        LOOP
            DBMS_OUTPUT.Put(DBMS_LOB.Substr(vCLOB, 200, vPos));
            vPos := vPos + 200;
        end loop;
        dbms_output.new_line;    
    
    end;    
end;
错误信息
ORA-20000: ORU-10028: line length overflow, limit of 32767 bytes per line
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
ORA-06512: at "SYS.DBMS_OUTPUT", line 91
ORA-06512: at line 13
20000. 00000 -  "%s"
*Cause:    The stored procedure 'raise_application_error'
           was called which causes this error to be generated.
*Action:   Correct the problem as described in the error message or contact
           the application administrator or DBA for more information.
原因及解决方案
  • 错误原因:不是缓冲区溢出,而是DBMS_OUTPUT.Put会将内容追加到当前行,直到调用new_line才会换行。你的代码中一直调用Put,最后才执行一次new_line,导致所有输出内容被合并成一行,超出了DBMS_OUTPUT每行最多32767字节的限制,触发ORU-10028错误。

  • 解决方案:

    1. 拆分输出为多行:每次输出一段内容后调用dbms_output.new_line,确保每行长度不超过限制。修改后的执行代码如下:
      set serveroutput on size unlimited; -- 设置足够大的输出缓冲区
      declare csv_output clob;
      begin
          sp_get_clob_data('TEST', 'LINE', csv_output); -- 修正存储过程名称,与定义一致
          declare 
          vClob CLOB := csv_output;
          vPos number;
          vLen number;
          vChunkSize constant number := 2000; -- 每次取2000字节,远小于32767的限制
          begin
              vLen := DBMS_LOB.GetLength(vClob);
              vPos := 1;
              while vPos <= vLen 
              LOOP
                  DBMS_OUTPUT.Put_line(DBMS_LOB.Substr(vCLOB, vChunkSize, vPos));
                  vPos := vPos + vChunkSize;
              end loop;    
          end;    
      end;
      /
      
    2. 注意事项:
      • 确保存储过程名称调用正确,原执行代码中sp_get_data与定义的sp_get_clob_data不一致,需修正。
      • 先执行set serveroutput on size unlimited;避免总内容大小超出缓冲区限制。
      • 每次拆分的块大小不要超过32767字节,设置2000字节是安全的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:43:27