2015-11-16 8 views
6

は、私はPL/SQLでINSERTUPDATEの両方を行うことができます。Oracle上のPL/SQLで行タイプ変数を使用しているMERGE?タイプ<code>foo%ROWTYPE</code>の変数<code>bar</code>で

INSERT INTO foo VALUES bar; 
UPDATE foo SET ROW = bar WHERE id = bar.id; 

しかし、私はMERGEをどのように行うのですか?

MERGE INTO foo USING bar ON foo.id = bar.id 
WHEN MATCHED THEN UPDATE SET ROW = bar 
WHEN NOT MATCHED THEN INSERT VALUES bar; 

PL/SQL:ORA-00942:次の方法は、以下のエラーメッセージを生成するテーブルまたはビューが存在しない

+1

これはオラクルのフォーラムで答えられていると思います。https://community.oracle.com/thread/621511?start=0&tstart=0ソロモンの答えを見てください。あなたのために働く可能性のあるFORALL Mergeもあります。 http://www.morganslibrary.org/reference/plsql/array_processing.html –

+0

ご回答いただきありがとうございます。ソロモンズの答えは、行タイプのすべてのフィールドを列挙しています。私は 'FORALL MERGE'がどのようにここで助けになるのか分かりません。しかし、MichaelSのソリューションは有望に見えます。 – Anders

+0

いいえ、私はどちらかの答えを得ることはできません。 ORA-38104:ON句で参照される列は更新できません:foo.id' – Anders

答えて

2

マイケルズは、上記スレッドに与える答えが正常に動作する必要があります。あなたが受信しているエラーメッセージ(ORA-38104:ON句で参照される列を更新することができません。foo.idは):エラー状態として

merge into foo 
    using (select null from dual) 
    on (foo.id = bar.id) 
    when matched then update set foo.id = bar.id, foo.another_field = bar.another_field 
    when not matched then insert VALUES bar; 

次のような何かをしようとしている示唆しています"ON"句で参照される列は更新できません。そのため、以下では正常に動作します:

merge into foo 
    using (select null from dual) 
    on (foo.id = bar.id) 
    when matched then update set foo.another_field = bar.another_field 
    when not matched then insert VALUES bar; 

をあなたが本当にfoo.idを更新する必要がある場合は、ここでの可能な解決策があります:How to avoid ORA-3814 error on merge?

編集

可能な代替にはなります

update foo set row = bar where foo.id = bar.id; 

if sql%rowcount = 0 then 
    insert into foo values bar; 
end if; 

これは、本質的にマージsと同じことをやってと同じである必要があります:次の手順を実行しますtatement。

+0

何らかの理由で実際にマージステートメントを使用する必要がない限り、私は可能な代替ソリューションを追加しました。 Solomon Yakobson(https://community.oracle.com/thread/621511?start=0&tstart=0)に記載されているように、マージ・ステートメントのwhen matched句では行タイプを使用できません – Chrisrs2292

関連する問題