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错误。解决方案:
- 拆分输出为多行:每次输出一段内容后调用
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; / - 注意事项:
- 确保存储过程名称调用正确,原执行代码中
sp_get_data与定义的sp_get_clob_data不一致,需修正。 - 先执行
set serveroutput on size unlimited;避免总内容大小超出缓冲区限制。 - 每次拆分的块大小不要超过32767字节,设置2000字节是安全的选择。
- 确保存储过程名称调用正确,原执行代码中
- 拆分输出为多行:每次输出一段内容后调用
内容的提问来源于stack exchange,提问作者SoftwareDveloper
相关产品推荐
相关产品推荐

