Oracle MERGE文

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

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

コメントを残す

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

CAPTCHA