5

特に、256 の最大文字数/行と 1000000 の最大文字数/バッファの制限がないもの。

4

6 に答える 6

7

おそらく、これらのオプションのいずれかがニーズに合うでしょう (サーバー側またはクライアント側のどちらで何かを記述するかによって異なります)。

(Mark Harrison による更新) AskTom 投稿の my-dbms-output パッケージを使用しました。非常に優れた機能の 1 つは、ビューを介して結果にアクセスできるため、クライアント プログラムで出力を簡単に表示できることです。短い名前に変更しました。

于 2009-03-11T07:35:34.483 に答える
6

オラクルのバージョンは?これらの制限は両方とも、最近のバージョンでは緩和されています。10.2 は 255 文字を超える行をサポートし (新しい制限は 32k)、最大バッファー サイズの制限を取り除きます。Oracle 9.2 には 1 行あたり 255 文字/合計 1 MB の制限がありましたが、Oracle はそのバージョンのサポートを終了しました。

于 2009-03-11T07:50:30.593 に答える
2

INSERTは素晴らしい代替手段です。プロセスから情報を取得するだけでなく、将来の参照や分析のために保持されます。また、SQLと呼ばれる非常に一般的な言語を使用して、結果を取得、フィルタリング、および処理できます。時間と順序を確認するために、デフォルトがsysdateの列を作成できます。ロールバックによるロギングの損失を回避するために、自律型トランザクション内に配置できます。

于 2009-03-11T21:18:11.447 に答える
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 に答える
1

dbms_outputの制限の1つは、ステートメントが終了した後にのみ出力が使用可能になることです。長時間実行されているプロセスを追跡するために、dbms_pipeを使用してステータスメッセージを送信します。パイプのもう一方の端で、プロセスが何をしているのかを確認できます。

于 2009-04-01T12:49:16.863 に答える
1

別のオプションは、おそらく優れたものではありませんが、アラート ログに書き込むことです。

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