OracleのMERGE文
最近では、すっかりおなじみとなったOracleのMERGE文。
条件に一致した場合はUPDATEが発行され、一致しなかった場合はINSERTが発行される。
テーブルからテーブルへ値を移す時に使われるサンプルが多いが、
実際には、プログラムからデータを登録するときにも利用できる。
たとえば、下記のようなテーブルが存在した時、
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を発行することができる。
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を追加する。
CREATE TABLE WK02 (
CODE CHAR(3) NOT NULL,
NAME VARCHAR(20) NOT NULL,
PRIMARY KEY (CODE)
);
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
コメントを残す