[Oracle] Oracle で 一行分の Upsert

2014年12月8日

 一行分の upsert だと merge 使ってもそんなにコード量は削減されないし、ODP.NET を経由した場合に、なにやら謎の例外 (AccessViolationException) が発生するケースがあったので、無名ブロックを使った対処方法をメモしておく。

declare
 v_count number;

begin
 select EMPNO into v_count from EMP where EMPNO = :empno;

 if (v_count = 1) then
  update EMP set ENAME = :ename where EMPNO = :empno;

 else
  insert into EMP (EMPNO, ENAME) values (:empno, :ename);

 end if;
end;
/

 ちなみに merge 文を使用する場合はこんな感じ。

merge into EMP using DUAL
   on (EMP.EMPNO = :empno)
when matched then
  update set ENAME = :ename
when not matched then
  insert (EMPNO, ENAME) values (:empno, :ename)
;





カテゴリー: Oracle, データベース

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org