特别是没有 256 个最大字符/行和 1000000 个最大字符/缓冲区限制的。
6 回答
也许这些选项之一会满足您的需求(取决于您是在服务器端还是客户端编写一些东西):
- UTL_FILE
- TEXT_IO
- AskTom 帖子
(由 Mark Harrison 更新)我使用了 AskTom 帖子中的 my-dbms-output 包。一个非常好的功能是您可以通过视图访问结果,以便在客户端程序中轻松显示输出。我将其重命名为更短的名称。
什么版本的甲骨文?在最近的版本中,这两个限制都已放宽。10.2 支持超过 255 个字符的行(新限制为 32k)并消除了最大缓冲区大小限制。Oracle 9.2 有每行 255 个字符/1 MB 的总限制,但 Oracle 已不再支持该版本。
您可以使用 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;
INSERT 是一个很棒的选择。您不仅可以从流程中获取信息,而且还可以保留这些信息以供将来参考或分析。并且可以使用一种称为 SQL 的非常常用的语言来检索、过滤和处理结果。您可以有一个默认为 sysdate 的列来检查时间和顺序。它可以放置在自治事务中,以避免由于回滚而丢失日志记录。
另一种选择,虽然可能不是一个很好的选择,是写入警报日志。
sys.dbms_system.ksdwrt(2,to_char(sysdate)|| ' -- The message ');
dbms_output 的一个限制是输出仅在语句完成后才可用。为了跟踪长时间运行的进程,我使用 dbms_pipe 发送状态消息。然后,在管道的另一端,您可以看到该过程在做什么。