Oracle MERGE文

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を使い分けてくれるので楽にロジックが組めるようになる。
厳密に、更新と挿入でロジックを分けている場合は、この方法は使えないけれど。

同じタグの記事
同じカテゴリの記事

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA