尤其是没有256个字符/行的字符 和1000000最大字符/缓冲限制。
答案 0 :(得分:7)
这些选项中的一个可能适合您的需求(取决于您是在服务器端还是客户端编写内容):
(由Mark Harrison更新)我在AskTom帖子中使用了my-dbms-output包。一个非常好的功能是您可以通过视图访问结果,以便在客户端程序中显示输出。我把它改名为一个较短的名字。
答案 1 :(得分:6)
什么版本的Oracle?在最近的版本中放宽了这两个限制。 10.2支持超过255个字符的行(新限制为32k)并消除了最大缓冲区大小限制。 Oracle 9.2每行有255个字符/ 1 MB总限制,但Oracle已经不支持该版本。
答案 2 :(得分:2)
您可以使用TCP包将输出写入终端或远程数据记录器。很容易处理在计划任务中运行的调试包代码。
编辑:以下是一个示例程序:
procedure pDebug( str in varchar2 )
-- output debugging message to display or tcp console
is
x number;
l number;
nPort number;
sAddress varchar2(5000);
begin
if c_bDebug = 1 then
if c_tcpbDebug = 1 then
if cSocket.remote_host is NULL then
nPort := strMetaDataValue( 'TCP-DEBUG-PORT' );
sAddress := strMetaDataValue( 'TCP-DEBUG-ADDRESS' );
dbms_output.put_line( 'tcp:port ' || nPort );
dbms_output.put_line( 'tcp:address ' || sAddress );
if length( sAddress ) > 1 and nvl( nPort, 0 ) > 0 then
begin
dbms_output.put_line( 'tcp:open start ' ||to_char( SYSDATE, 'DD-MON-YYYY HH24:MI:SS' ) );
cSocket := utl_tcp.open_connection( sAddress, nPort ); -- open connection
dbms_output.put_line( 'tcp:open ' || to_char( SYSDATE, 'DD-MON-YYYY HH24:MI:SS' ) );
c_tcpbDebug := 1;
exception
when others then
dbms_output.put_line( SQLERRM );
dbms_output.put_line( 'Cant open debug tcp session ' || SYSTIMESTAMp );
c_tcpbDebug := 0;
end;
else
c_tcpbDebug := 0;
end if;
end if;
if cSocket.remote_host is not NULL then
dbms_output.put_line( 'tcp:write' );
x := utl_tcp.write_line( cSocket, to_char( SYSDATE, 'DD-MON-YYYY HH24:MI:SS' ) || ' ' || str );
x := utl_tcp.write_line( cSocket, utl_tcp.crlf );
end if;
end if;
-- this bit prints out the debug statement in 254 char bits
l := length( str );
x := 1;
while x <= l loop
dbms_output.put_line( substr( str,x,254 ) );
x := x + 254;
end loop;
end if;
end pDebug;
答案 3 :(得分:2)
INSERT是一个很棒的选择。您不仅可以从过程中获取信息,还可以保留以供将来参考或分析。并且可以使用称为SQL的非常通用的语言检索和过滤和处理结果。您可以使用默认值为sysdate的列来检查时间和顺序。它可以放在自治事务中,以避免因回滚而丢失日志记录。
答案 4 :(得分:1)
另一种选择,虽然可能不是很好,但是要写入警报日志。
sys.dbms_system.ksdwrt(2,to_char(sysdate)|| ' -- The message ');
答案 5 :(得分:1)
dbms_output的一个限制是只有在语句结束后输出才可用。为了跟踪长时间运行的进程,我使用dbms_pipe发送状态消息。然后在管道的另一端,您可以看到流程的最新进展。