您的位置:首页 > 理论基础 > 计算机网络

关于10g以下dbms_output.put_line超长的问题 (转http://wallimn.iteye.com/blog/486615)

2014-06-19 15:33 411 查看
关于10g以下dbms_output.put_line超长的问题

博客分类:
数据库

Oracle

关于10g以下dbms_output.put_line超长的问题

对于10gdbms_output.put_line的长度是没有限制

如果报错:buffer overflow,执行如下语句即可:

set serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED

由于10g以下dbms_output.put_line的长度有限制

所以今天特意写了一个按照回车符来截取字符串,也就是按行截取,然后打印出来的过程,希望对某些人有用!

create or replace procedure print_proc(str in varchar2) is

/*

--打印字符串,调试的时候用

--由于字符串过长,超过了dbms_output.put_line的长度,故采用本程序分行打印出来

--@auther:Z.X.T

--@date:2007-6-26

*/

begin

dbms_output.put_line('lengthb(str) =' || lengthb(str));

if (lengthb(str) < 255) then

dbms_output.put_line(str);

else

for i in 1 .. length(str) - length(replace(str, chr(10))) + 1

loop

dbms_output.put_line(substr(str, instr(chr(10) || str, chr(10), 1, i), instr(str ||

chr(10), chr(10), 1, i) -

instr(chr(10) || str, chr(10), 1, i)));

end loop;

end if;

exception

when others then

dbms_output.put_line(sqlerrm);

dbms_output.put_line(dbms_utility.format_call_stack);

end print_proc;

另一篇相关文章:

Dbms_Output.Put_Line字符超过255的解决方案

在Oracle 10g之前,使用Dbms_Output.Put_Line进行输出调试,如果输出信息单行超过255个字符,则会提示错误:ORA-20000: ORU-10028: line length overflow, limit of 255 chars per line,相当烦人的一个限制。

网上搜的解决方案,目前觉得还不错,使用起来也很方便。

-- 第一步

create or replace package my_output

as

procedure put( s in varchar2 );

procedure put_line( s in varchar2 );

procedure new_line;

function get_line( n in number ) return varchar2;

pragma restrict_references( get_line, wnds, rnds );

function get_line_count return number;

pragma restrict_references( get_line_count, wnds, rnds, wnps );

pragma restrict_references( my_output, wnds, rnds, wnps, rnps );

end;

-- 第二步

create or replace package body my_output

as

type Array is table of varchar2(4000) index by binary_integer;

g_data array;

g_cnt number default 1;

procedure put( s in varchar2 )

is

begin

if ( g_data.last is not null ) then

g_data(g_data.last) := g_data(g_data.last) || s;

else

g_data(1) := s;

end if;

end;

procedure put_line( s in varchar2 )

is

begin

put( s );

g_data(g_data.last+1) := null;

end;

procedure new_line

is

begin

put( null );

g_data(g_data.last+1) := null;

end;

function get_line( n in number ) return varchar2

is

l_str varchar2(4000) default g_data(n);

begin

g_data.delete(n);

return l_str;

end;

function get_line_count return number

is

begin

return g_data.count+1;

end;

end;

-- 第三步

create or replace view my_output_view

as

select rownum lineno, my_output.get_line( rownum ) text

from all_objects

where rownum < ( select my_output.get_line_count from dual );

-- 应用

使用my_output.put_line替换Dbms_Output.Put_Line进行输出,通过select * from my_output_view进行输出查询。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: