2016-03-28 10 views
0

私は、同じレコードをデータベースに挿入しようとするのを避けるつもりです。 このステートメントはレコードを挿入しません。 selectで参照されているレコードが存在しないため、挿入する必要があります。私が間違っているすべてのアイデア。Oracle、Merge文が機能しない

MERGE INTO XX0101.CAMPAIGN b 
    USING (SELECT * FROM XX0101.CAMPAIGN WHERE CAMPAIGN_ID=7 AND X_ID='0123' AND Y_ID='4567') a 
    ON (a.CAMPAIGN_ID = b.CAMPAIGN_ID) 
WHEN NOT MATCHED THEN 
    INSERT (CAMPAIGN_ID, X_ID, Y_ID, ROW_LAST_UPDATE_TS, ROW_LAST_UPDATE_ID) 
    VALUES (7, '0123', '4567', SYSDATE, 'ABC'); 
+0

Uh ..テーブルからレコードを照会し、同じテーブル(それはもちろんそれが見つかる)で検索するようにOracleに依頼しています。一致してからINSERT ...なぜそれを挿入すると思いますか? – Ditto

+0

私はMERGEについて理解していますが、選択はテーブル上で最初に実行され、レコードが存在しない場合は挿入されます。私は間違っているかもしれませんが、私はこの機能を見て、その機能を誤解している可能性があります。 – jimmy

+0

あなたは正しい "並べ替え"です。最初に、Oracleは 'USING'節のすべての行を取得します。次に、その結​​果セット "a"を初期テーブル "b"に結合します。結合に 'ON'節を使用します。それが一致するかどうか、あなたがチェックしているものです。あなたの結果セットは空です( 'CAMPAIGN_ID = 7 'は存在しないので)、MERGEには何もありません。;)あなたは主キーか一意制約を持っていると思いますか?もしそうなら、 'INSERT'だけでなく、' DUP_VAL_ON_INDEX'を介して存在することをOracleに伝えてみませんか? – Ditto

答えて

0

これはMERGEのためではなく、シンプルなINSERTのための仕事のような音はありません。

BEGIN 
    INSERT INTO XX0101.CAMPAIGN 
      (CAMPAIGN_ID, X_ID, Y_ID, ROW_LAST_UPDATE_TS, ROW_LAST_UPDATE_ID) 
     VALUES (7, '0123', '4567', SYSDATE, 'ABC'); 
    EXCEPTION 
    WHEN DUP_VAL_ON_INDEX THEN 
     NULL; 
    END; 
/

これは、そこにPKまたはユニークなインデックスがあることを前提としています。

+0

私はPKを持っていますので、私はこのアプローチを使用します。 – jimmy

関連する問題