無料の「Oracle Database XE」で高速バッチ処理:活用のポイント

兒玉敏幸(101)
2008-08-15 16:09:01
  • このエントリーをはてなブックマークに追加

1-5. MERGE文の活用

 SQLのMERGE文はご存知でしょうか?

 MERGE文はOracleデータベースではOracle9iから、標準規格としてはSQL:2003規格から登場した比較的新しいステートメントで、UPDATE+INSERTを1文で実行できるとても便利なSQLです。

 データを操作する際に、該当するデータ(レコード)があればUPDATEで新しいデータに更新し、レコードが無ければINSERTで追加するような処理は多々あると思います。この処理を普通に書くと、SELECTしてIF文で分岐し、UPDATE/INSERTを行うといったような数ステップのロジックとなるのですが、トランザクションを考えるとさらに複雑になって意外に大変な思いをすることがあります。

 このような場合にMERGE文を使うと1文で記述できるのでとてもすっきりします。

 MERGE文の例を示します。

DECLARE
  CURSOR c1 IS SELECT * FROM EMP2;
BEGIN
  FOR c1_rec IN c1 LOOP
    UPDATE EMP SET SAL = c1_rec.SAL WHERE EMPNO = c1_rec.EMPNO;
    IF SQL%NOTFOUND THEN
      INSERT INTO EMP VALUES(c1_rec.empno, c1_rec.ename, c1_rec.job, c1_rec.mgr, c1_rec.hiredate, c1_rec.sal, c1_rec.comm, c1_rec.deptno);
    END IF;
  END LOOP;
  COMMIT;
END;

 上記のようにEMP2に更新データが入っていて、EMPを更新するようなロジックは次のように1文で記述できます。

MERGE INTO EMP T1
  USING (SELECT * FROM EMP2) T2
  ON (T1.EMPNO = T2.EMPNO)
WHEN MATCHED THEN
  UPDATE SET T1.SAL = T2.SAL
WHEN NOT MATCHED THEN
  INSERT VALUES(t2.EMPNO, t2.ENAME, t2.JOB, t2.MGR, t2.HIREDATE, t2.SAL, t2.COMM, t2.DEPTNO);

 構文は多少複雑ですが、Oracleデータベースの処理としては1文ですので、とてもシンプルになります。

 101willではMERGE文を自動出力しますので、このような複雑な構文を覚える必要がありません。スクリプトを自動生成する仕組みがあるとタイポすることもありませんし、非常に便利です。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]