4

Aqua Data Studioを使用して、出力ステートメントを全体に分散させることにより、ストアドプロシージャをデバッグしています。

パッケージに整合性制約に違反するdeleteステートメントがあります。

DELETE FROM x WHERE x.ID = an_x_with_children;

予想どおり、この行のORA-02292でプロシージャが失敗します。an_x_with_children変数の値を見たいのですが。だから私は次のような出力で行をラップします:

dbms_output.put('Attempting to delete x: ' || an_x_with_children);
DELETE FROM x WHERE x.ID = an_x_with_children;
dbms_output.put(' Success');

また、整合性制約違反のエラーメッセージが表示される前に、メッセージがメッセージコンソールの最後のものとして表示されることを期待してください。 しかし、それは印刷されません!

put_line()ここで、次のような手順を使用するように出力を変更すると、次のようになります。

dbms_output.put_line('Attempting to delete x: ' || an_x_with_children);
DELETE FROM x WHERE x.ID = an_x_with_children;
dbms_output.put_line(' Success');

procがエラーになる直前に、「x:123を削除しようとしています」というメッセージが表示されます。

パッケージのドキュメントには、この点で異なる動作をする手順と手順dbms_outputについては記載されていません。たとえば、それは言いますputput_line

PUTまたはPUT_LINEを使用して作成した出力はバッファリングされます。

したがって、procエラー時に両方またはどちらも出力を表示しないことを期待します。

誰かが私にこの行動で何が起こっているのか説明できますか?

4

1 に答える 1

6

これがあなたが見ている振る舞いを示す例です:

SQL> exec dbms_output.put_line('hello')
hello

PL/SQL procedure successfully completed.

SQL> exec dbms_output.put('hello again')

PL/SQL procedure successfully completed.

SQL> exec dbms_output.put(' and again')

PL/SQL procedure successfully completed.

SQL> exec dbms_output.new_line
hello again and again

PL/SQL procedure successfully completed.

ドキュメントには、「SQL*PlusはSQL文または匿名のPL/SQL呼び出しを発行した後にGET_LINESを呼び出す」と記載されています。

また、プロシージャGET_LINESは、「このプロシージャはバッファから行の配列を取得します」と述べています。

PUTを使用すると、まだラインを完了していません。そのため、印刷されません。

NEW_LINEプロシージャは、これについても言及しています。「このプロシージャは、行末マーカーを配置します。GET_LINEプロシージャとGET_LINESプロシージャは、「newlines」で区切られた「lines」を返します。PUT_LINEプロシージャまたはNEW_LINEプロシージャを呼び出すたびに、行が生成されます。これはGET_LINE(S)によって返されます。」

よろしく、
ロブ。

于 2012-09-21T14:39:06.450 に答える