2016-08-24 6 views
0

いくつかのレコードを処理している間に、プログラムの進行に合わせて出力を表示したいとします。行を読み込むだけでは助けにならない。ただバッファから取り出しているだけなので、他には何もない。たとえば、次のようにdbms_output.put_line()の代わりに、繰り返しごとに呼び出されるたびに内容を1行ずつ出力する方法がありますか?

DECLARE 
    CURSOR cEmploee IS SELECT * FROM g_emploees; 
    iTotal INTEGER := 0; 
    iCount INTEGER := 0; 
BEGIN 
    SELECT COUNT(*) FROM g_emploees INTO iTotal; 
    FOR rLine IN cEmploee loop 
    dbms_output.put_line('Porcessed['||rLine.id||']: '|| ((iCount/iTotal)*100) || '%') 
    iCount := iCount + 1; 
    END LOOP; 
END; 
  1. 私はDBMS_OUTPUT.GET_LINE()を使用し、だから、答えマーキングを停止することはできません!
  2. 出力を読み取り専用の理由でファイルにパイプすることはできません!

処理された%を表示し、その行をすべてのITERATIONで処理するために使用することができますが、最後にはバッファ内に残っている一連の行ではありません(DBMSのコマンド/ "dbms_output.put_line"が実行終了時に500行ではなく呼び出された場合、PL/SQLに表示されるすべての正確な時刻を表示する必要があります。コマンドウィンドウONステートメント以下

+0

号はそのようなオプションはありません。プロシージャが完了したときにのみ、出力が表示されます。 –

+3

[OracleのPL/SQLからの出力をフラッシュする方法はありますか?](http://stackoverflow.com/questions/1472587/is-there-any-way-to-flush-output-from-pl) -sql-in-oracle) – user272735

+0

また、[各反復で呼び出されたときにdbms_output.put_lineを1行ずつ出力する方法]の複製です(http://stackoverflow.com/questions/39099366/how-to-make- dbms-output-put-line-to-print-line-by-every-in-it-every-itという名前で作成され、最初のものが複製として閉じられたために作成されたものです。 –

答えて

2
CREATE OR REPLACE FUNCTION test_pipe 
    RETURN sys.DBMS_DEBUG_VC2COLL 
    pipelined 
    as 
    CURSOR cEmploee IS 
    SELECT * FROM g_emploees; 
    iTotal INTEGER := 0; 
    iCount INTEGER := 0; 
    BEGIN 
    SELECT COUNT(*) 
    INTO iTotal 
    FROM g_emploees ; 
    FOR rLine IN cEmploee loop 
    PIPE row('Porcessed['||rLine.id||']: '|| ((iCount/iTotal)*100) || '%'); 
    iCount := iCount + 1; 
    END LOOP; 
    END; 
/

--execute:

SQL >set arraysize 1 

SQL > SELECT * FROM TABLE(test_pipe); 
+1

これは機能しません。これがシステムで動作しているかどうか再度確認してください。 "PIPE文は非パイプ関数では使用できません"というコンパイルエラーが発生します。私のoracleバージョン - 11gr2 – XING

+0

今すぐ確認してください。私は私の電話の上司にそれを書いています:-( 現在、私はシステムに接続していません。 –

+0

本当に、私はあなたに "パイプライン"あなたが答えをマークして、それをアップして、いくつかの評判を得るのを助けてくれるならば、 – XING

関連する問題