在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进行输出查询。
PS:体检发现脂肪肝,不爽、不爽、非常不爽!