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
については記載されていません。たとえば、それは言いますput
put_line
PUTまたはPUT_LINEを使用して作成した出力はバッファリングされます。
したがって、procエラー時に両方またはどちらも出力を表示しないことを期待します。
誰かが私にこの行動で何が起こっているのか説明できますか?