5

特别是没有 256 个最大字符/行和 1000000 个最大字符/缓冲区限制的。

4

6 回答 6

7

也许这些选项之一会满足您的需求(取决于您是在服务器端还是客户端编写一些东西):

(由 Mark Harrison 更新)我使用了 AskTom 帖子中的 my-dbms-output 包。一个非常好的功能是您可以通过视图访问结果,以便在客户端程序中轻松显示输出。我将其重命名为更短的名称。

于 2009-03-11T07:35:34.483 回答
6

什么版本的甲骨文?在最近的版本中,这两个限制都已放宽。10.2 支持超过 255 个字符的行(新限制为 32k)并消除了最大缓冲区大小限制。Oracle 9.2 有每行 255 个字符/1 MB 的总限制,但 Oracle 已不再支持该版本。

于 2009-03-11T07:50:30.593 回答
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;
于 2009-03-11T07:46:45.097 回答
2

INSERT 是一个很棒的选择。您不仅可以从流程中获取信息,而且还可以保留这些信息以供将来参考或分析。并且可以使用一种称为 SQL 的非常常用的语言来检索、过滤和处理结果。您可以有一个默认为 sysdate 的列来检查时间和顺序。它可以放置在自治事务中,以避免由于回滚而丢失日志记录。

于 2009-03-11T21:18:11.447 回答
1

另一种选择,虽然可能不是一个很好的选择,是写入警报日志。

sys.dbms_system.ksdwrt(2,to_char(sysdate)|| ' -- The message ');
于 2009-03-11T07:51:44.880 回答
1

dbms_output 的一个限制是输出仅在语句完成后才可用。为了跟踪长时间运行的进程,我使用 dbms_pipe 发送状态消息。然后,在管道的另一端,您可以看到该过程在做什么。

于 2009-04-01T12:49:16.863 回答