OracleのMERGE文
最近では、すっかりおなじみとなったOracleのMERGE文。
条件に一致した場合はUPDATEが発行され、一致しなかった場合はINSERTが発行される。
テーブルからテーブルへ値を移す時に使われるサンプルが多いが、
実際には、プログラムからデータを登録するときにも利用できる。
たとえば、下記のようなテーブルが存在した時、
1 2 3 4 5 6 7 8 | CREATE TABLE WK01 ( CODE CHAR(3) NOT NULL, NAME VARCHAR2(20) NOT NULL, CNT NUMBER(5) NOT NULL, INS DATE, UPD DATE, PRIMARY KEY (CODE) ); |
下記のようなMERGEを発行することができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | MERGE INTO WK01 T1 USING ( SELECT ? AS CODE, ? AS NAME FROM DUAL ) T2 ON ( T1.CODE = T2.CODE ) WHEN MATCHED THEN UPDATE SET NAME = T2.NAME, CNT = CNT + 1, UPD = SYSDATE WHEN NOT MATCHED THEN INSERT ( CODE, NAME, CNT, INS ) VALUES ( T2.CODE, T2.NAME, 1, SYSDATE ); |
?にはバインド変数を設定する。
また、WK01.NAMEにはWK02.NAMEを設定しなくてはならない場合、
USINGにSELECTを追加する。
1 2 3 4 5 | CREATE TABLE WK02 ( CODE CHAR(3) NOT NULL, NAME VARCHAR(20) NOT NULL, PRIMARY KEY (CODE) ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | MERGE INTO WK01 T1 USING ( SELECT ? AS CODE, (SELECT T3.NAME FROM WK02 T3 WHERE T3.CODE = ?) AS NAME FROM DUAL ) T2 ON ( T1.CODE = T2.CODE ) WHEN MATCHED THEN UPDATE SET NAME = T2.NAME, UPD = SYSDATE WHEN NOT MATCHED THEN INSERT ( CODE, NAME, INS ) VALUES ( T2.CODE, T2.NAME, SYSDATE ); |
構文はよく忘れるけど、判定無しにupdateとinsertを使い分けてくれるので楽にロジックが組めるようになる。
厳密に、更新と挿入でロジックを分けている場合は、この方法は使えないけれど。
同じタグの記事
- Oracleに負荷をかけているプログラムを探す
- OracleのFLASHBACKテーブルをPURGEする
- ORACLEのMERGE文 補足
- Oracleのパスワードの有効期限
- sqlite3のデータ型
- 手軽なのに強力なsqlite3
同じカテゴリの記事