MERGE ๋ฌธ์ WHEN ์ ์ ๊ธฐ์ ์์์ ๋ฌด๊ดํ๊ฒ UPDATE, INSERT ์์๋ก ๋์ํ๋ค. ์ด๋ ON ์ ์ UPDATE ๋ฌธ์ WHERE ์ ๊ณผ ์ ์ฌํ๊ฒ ๋์ํ๋ค. ์ด๋ก ์ธํด ์์์น ๋ชปํ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค.
ํ ์คํธ๋ฅผ ์ํด ์๋์ ํ ์ด๋ธ์ ์์ฑํ์.
1 2 3 4 |
-- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 VARCHAR2(1), c2 NUMBER); ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (c1); |
1 2 3 4 5 6 7 8 9 10 11 |
-- 2: S1 MERGE INTO t1 USING DUAL ON (c1 = 'A' ) WHEN MATCHED THEN UPDATE SET c2 = c2 + 1 WHEN NOT MATCHED THEN INSERT VALUES ( 'A' , 1); 1 ํ์ด ๋ณํฉ๋์์ต๋๋ค. |
1 2 3 4 5 6 7 8 9 10 11 |
-- 3: S2 MERGE INTO t1 USING DUAL ON (c1 = 'A' ) WHEN MATCHED THEN UPDATE SET c2 = c2 + 1 WHEN NOT MATCHED THEN INSERT VALUES ( 'A' , 1); -- ๋ธ๋กํน |
1 2 3 4 |
-- 4: S1 COMMIT ; ์ปค๋ฐ์ด ์๋ฃ๋์์ต๋๋ค. |
1 2 |
-- 5: S2 ORA-00001: ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด(SCOTT.T1_PK)์ ์๋ฐฐ๋ฉ๋๋ค |
์์ ์ MERGE ๋ฌธ์ ์๋ ์ฝ๋์ ์ ์ฌํ๊ฒ ๋์ํ๋ค. UPDATE ๋ฌธ์ WHERE ์ ์ consistent read๋ก ๋์ํ๋ค. S2 ์ธ์ ์ MERGE ๋ฌธ์ UPDATE ๋์์ด ์์ด INSERT ๋ฌธ์ด ์ํํ์ง๋ง, S1 ์ธ์ ์ด ๋์ผ PK๋ก INSERT ๋ฌธ์ด ์ํํ๊ณ ์์ด ๋ธ๋กํน์ด ๋ฐ์ํ ๊ฒ์ด๋ค.
1 2 3 4 5 6 7 8 |
-- 6 BEGIN UPDATE t1 SET c2 = c2 + 1 WHERE c1 = 'A' ; IF SQL%ROWCOUNT = 0 THEN INSERT INTO t1 VALUES ( 'A' , 1); END IF; END ; |
1 2 3 4 5 6 7 8 9 10 |
-- 7: S1 BEGIN INSERT INTO t1 VALUES ( 'B' , 1); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN UPDATE t1 SET c2 = c2 + 1 WHERE c1 = 'B' ; END ; / PL/SQL ์ฒ๋ฆฌ๊ฐ ์ ์์ ์ผ๋ก ์๋ฃ๋์์ต๋๋ค. |
1 2 3 4 5 6 7 8 9 10 |
-- 8: S2 BEGIN INSERT INTO t1 VALUES ( 'B' , 1); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN UPDATE t1 SET c2 = c2 + 1 WHERE c1 = 'B' ; END ; / -- ๋ธ๋กํน |
1 2 3 4 |
-- 9: S1 COMMIT ; ์ปค๋ฐ์ด ์๋ฃ๋์์ต๋๋ค. |
S2 ์ธ์ ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ UPDATE ๋ฌธ์ด ์ํ๋๋ค. ์๋ฌ๋ ๋ฐ์ํ์ง ์์ง๋ง UPDATE ๋ฌธ์ผ๋ก ์ธํด ๋์์ฑ ์ ํ๋ ์ฌ์ ํ ๋ฐ์ํ ์ ์๋ค๋ ์ ์ ์ฃผ์ํด์ผ ํ๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 |
-- 10: S2 PL/SQL ์ฒ๋ฆฌ๊ฐ ์ ์์ ์ผ๋ก ์๋ฃ๋์์ต๋๋ค. SELECT * FROM t1; C1 C2 -- -- A 1 B 2 2 ํ์ด ์ ํ๋์์ต๋๋ค. |
'Oracle > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํน์ ํ์ ๊ณ์ธต ๊ฒฝ๋ก ์กฐํ (0) | 2020.03.03 |
---|---|
์ฐ์ ๊ฐ ๊ทธ๋ฃนํ (0) | 2019.09.02 |
ORA-00937 ์๋ฌ (0) | 2019.04.22 |
NVL, NVL2 ํจ์์ ์ธ์ ํ๊ฐ (0) | 2019.03.29 |
์ฉ์ด ๋จ์ด ๋ถ๋ฆฌ (0) | 2019.03.14 |