一行分の 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) ;