2016-06-24 10 views
0

最後に削除文があります。基本的には、マージした行が返された場合、またはマッチした場合にのみ削除します。単一のmerge intoステートメントで行うことは可能ですか?異なる表からの削除にOracleがマージする

MERGE INTO ${TABLE_NAME} T 
USING (
    SELECT 
    ERRORCODE, PROCESSINGFILENAME, 
    RECORDNUMBER from ERROR_UPLOAD_T 
) TMP 
ON (T.RECORDNUMBER = TMP.RECORDNUMBER and 
T.PROCESSINGFILENAME= TMP.PROCESSINGFILENAME and 
T.PROCESSINGFILENAME='${new_err_xml}') 
WHEN MATCHED THEN 
UPDATE SET 
    T.STATUS = 'ERROR', 
    T.ERRORSOURCE = 'BRM', 
    T.ERRORCODE = TMP.ERRORCODE 

DELETE from ERROR_UPLOAD_T WHERE 
PROCESSINGFILENAME like '${new_err_xml}'; 

これができない場合は、これを行うにはより良い方法を教えてください。この特定の文は、sqlplusを使用するシェル・スクリプトで呼び出されます。

編集:私はこの方法を試して、それは働くように見えます。

は、私は方法を以下にクエリを変更して、結果を達成するために管理

MERGE INTO ${TABLE_NAME} T 
USING (
    SELECT 
    ERRORCODE, PROCESSINGFILENAME, 
    RECORDNUMBER from ERROR_UPLOAD_T 
) TMP 
ON (T.RECORDNUMBER = TMP.RECORDNUMBER and 
T.PROCESSINGFILENAME= TMP.PROCESSINGFILENAME and 
T.PROCESSINGFILENAME='${new_err_xml}') 
WHEN MATCHED THEN 
UPDATE SET 
    T.STATUS = 'ERROR', 
    T.ERRORSOURCE = 'BRM', 
    T.ERRORCODE = TMP.ERRORCODE; 

if (sql%rowcount > 0) then 
    DELETE from ERROR_UPLOAD_T WHERE 
    PROCESSINGFILENAME like '${new_err_xml}'; 
end if; 

COMMIT; 
END; 
/
+1

あなた自身の質問に答えることができれば、実際にそれを回答ではなく編集として投稿することをお勧めします。 –

+1

そして、いいえ、( 'using'句から)ソーステーブルをマージステートメントの一部として削除することはできません。 –

+0

@ Mr.Llama自分の投稿に答えることはできません。しかし、私の疑問は依然として同じです。「私たちは単一マージ状態で達成できますか?私は以下に私の答えを掲載した。 – user2570205

答えて

1

を開始します。

BEGIN 
MERGE INTO ${TABLE_NAME} T 
USING (
    SELECT 
    ERRORCODE, PROCESSINGFILENAME, 
    RECORDNUMBER from ERROR_UPLOAD_T 
) TMP 
ON (T.RECORDNUMBER = TMP.RECORDNUMBER and 
T.PROCESSINGFILENAME= TMP.PROCESSINGFILENAME and 
T.PROCESSINGFILENAME='${new_err_xml}') 
WHEN MATCHED THEN 
UPDATE SET 
    T.STATUS = 'ERROR', 
    T.ERRORSOURCE = 'BRM', 
    T.ERRORCODE = TMP.ERRORCODE; 

if (sql%rowcount > 0) then 
    DELETE from ERROR_UPLOAD_T WHERE 
    PROCESSINGFILENAME like '${new_err_xml}'; 
end if; 

COMMIT; 
END; 
/
+0

これはやや奇妙なようです。 source内のany *行がターゲット内のいずれかの行と一致する場合 - 少なくとも1つの更新を行います。 - ソース内のすべての行を削除します。実際にマッチしたものだけではありません。そして行が一致しない場合は、thamをすべて保持します。目的のテーブルに一致する行を追加して後でもう一度実行することを期待している場合を除き、私はそれがどのように役立つかすぐにはわかりません。しかしそれは「any」の部分に戻ります。それはちょっと変わったようです - もしあなたが本当に望んでいるのであれば、これはチェックする方法です。 –

+0

@AlexPooleあなたは正しいです、それは詳細とエラー行を作成することができます実行中の並列処理。だから私は彼らがロードされるまでそれらを保持します。しかし、はい、読み込みに失敗した場合、それらを再処理して読み込むのは手動です。最後に、ソースとデスティネーションは一点で一致する必要があるため、一致すると削除されます。 – user2570205

+0

@AlexPoole私の以前の声明での問題は、ターゲットに一致するものがなくても削除されているということです。つまり、データはまだターゲットにロードされていません。マルチスレッドプログラムの問題は、データの読み込みを遅らせる可能性がありますが、1つ存在する必要があります。 – user2570205

1

いいえ、あなたは他の場所でマージ自体の一部として(using句から)ソース表から削除したりすることはできません。 From the documentation

それを移入または更新中に、テーブル内のデータをクリーンアップするには、DELETE where_clauseがを指定します。この句の影響を受ける行は、マージ操作によって更新される宛先表の行のみです。

あなたはあなたが望むものではない宛先テーブルからのみ削除できます。

関連する問題