8

barタイプの変数を使用すると、 PL/SQL でfoo%ROWTYPE両方を実行できます。INSERTUPDATE

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: テーブルまたはビューが存在しません

4

1 に答える 1

4

上記のスレッドでMichaelSが提供する回答は正常に機能するはずです。受け取ったエラー メッセージ (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 を更新する必要がある場合は、次の解決策が考えられます:マージ時に ORA-3814 エラーを回避するには?

編集

考えられる代替手段は、次のようにすることです。

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

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

これは基本的に、merge ステートメントと同じことを行うことと同じです。

于 2015-12-15T16:38:46.740 に答える