1

2つのテーブルがあります:生データを含む一時テーブル。その中の行が繰り返されている可能性があります(1回以上)。2つ目は、実際のデータを含むターゲットテーブルです(すべての行が一意です)。

カーソルを使用して行を転送しています。カーソル内でMERGEステートメントを使用します。どの行が更新され、どの行が削除されるかをDBMS_OUTPUT.PUT_LINEを使用してコンソールに出力するにはどうすればよいですか?

公式ドキュメントによると、このステートメントにはそのような機能はありません。

回避策はありますか?

4

2 に答える 2

1

なぜあなたがこれをしたいのか分かりません。の出力では、誰かがそれを見るdbms_output 必要があります。誰かがすべての出力を調べる必要があるだけでなく、そうでなければ意味がありません。20行を超える場合は、誰も気にする必要はありません。誰もすべての出力を調べて確認する必要はありませんが、実際にログに記録する必要がある場合は、この方法で積極的に自分自身に害を及ぼしています。

どの行が更新または削除されたかを本当にログに記録する必要がある場合は、いくつかのオプションがあります。ただし、どちらもパフォーマンスの低下を伴います。

  1. BULK COLLECTに切り替えることができます。これにより、一時テーブルのROWIDを使用してカーソルを作成できます。これに2つのテーブルの結合を一括収集します。ROWIDに基づいて、ビジネスロジックに従ってターゲットテーブルを更新/削除してから、実行された操作を示す何らかのフラグで一時テーブルを更新します。

  2. 別のテーブルに何が起こっているかをログに記録するトリガーをターゲットテーブルに作成します。

実際には、更新/削除の数がわかっていることが重要でない限り、何もするべきではありません。何か問題が発生した場合にエラーが発生するようにMERGEステートメントを作成し、エラーログ句を使用して受信したエラーをログに記録します。それらはあなたが注意を払うべきものである可能性が高いです。

于 2013-01-18T09:08:12.797 に答える
1

以前の投稿者は、カーソル/ループとレビュー用の出力ログの両方のために、このアプローチは疑わしいとすでに述べています。

SQL Serverでは、MERGEステートメントにOUTPUT句があり、$ action(挿入、更新、削除)が実行された別のテーブルに行を挿入し、挿入または削除/上書きされたデータの列を挿入できます。これにより、要求どおりに要約できます。

同等のOracleRETURNING句は、MERGEでは機能しない可能性がありますが、UPDATEおよびDELETEでは機能します。

于 2013-04-02T19:03:41.727 に答える