2011-01-21 27 views
1

レコードの存在を示すOracleの関数、またはこれを実現するためのその他の有用なテクニックはありますか?UPDATEレコード(存在する場合)。そうでない場合はOracleのINSERT

編集:私がやったMERGE文を使用して:

MERGE 
INTO lims_min.mytab src 
USING lims_min.mytab tgt 
    ON ( src.col1 = tgt.col1 
     AND tgt.col1 = p_val1 
     AND src.col2 = tgt.col2 
     AND tgt.col2 = p_val2 
     ) 

WHEN MATCHED 
THEN 
UPDATE 
    SET tgt.col3=p_val3, 
     tgt.col4=p_val4 

WHEN NOT MATCHED 
THEN 
INSERT (col1, col2, col3, col4) 
VALUES (val1, val2, val2, val4); 

私はCOL3が無効識別子であるというエラーを取得します。タイプミスがなく、既存のcolumn.p_val1、p_val2、p_val3およびp_val4はストアドプロシージャに渡される文字列パラメータです。私は問題がこれらのパラメータにあるかもしれないと思っています、おそらくWHEREステートメントの中に置くべきでしょうか? アイデア

+0

Oracleの10、私が得た "PL/SQL:ORA-00904: ""。" P COL3 ":無効な識別子" – sarsnake

+1

私はあなたが必要だと思います"MERGE INTO tgt"(srcではない) - それらを切り替えます。私はあなたのsrcテーブルに参加する必要はないと思う - ちょうど指定する:ON(src.col1 = p_val1とsrc.col2 = p_val2) – Gerrat

+0

うわー、良い1つのジェラート!ありがとうございました。かなり汚い – sarsnake

答えて

4

オラクルでmergeを探しています。

MERGE 
     INTO target_table tgt 
     USING source_table src 
     ON (src.object_id = tgt.object_id) //The key to check if the record exists 
     WHEN MATCHED // if exists 
     THEN 
    UPDATE 
     SET tgt.object_name = src.object_name //update it 
     ,  tgt.object_type = src.object_type 
     WHEN NOT MATCHED       // if not exists 
     THEN 
    INSERT (tgt.object_id     //then insert 
      , tgt.object_name 
      , tgt.object_type) 
    VALUES (src.object_id 
      , src.object_name 
      , src.object_type); 
+0

ソースとターゲットを同じテーブルにすることはできますか?私はちょうどそれをやろうとしているし、列(既存のもの)の1つが無効な識別子であるというOracleエラーが発生します.... – sarsnake

+0

といいえ、私は一致する列を更新しません:)他を更新しようとしています列は、これの全体のポイントです... – sarsnake

+0

適切にエイリアスされている場合は、同じソースとターゲットを使用することができます。 – DCookie

関連する問題