Oracle:DBMS_OUTPUT包的任何替代品?

时间:2009-03-11 07:29:15

标签: oracle dbms-output

尤其是没有256个字符/行的字符 和1000000最大字符/缓冲限制。

6 个答案:

答案 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发送状态消息。然后在管道的另一端,您可以看到流程的最新进展。