MERGE λ¬Έμ WHEN μ μ κΈ°μ μμμ 무κ΄νκ² UPDATE, INSERT μμλ‘ λμνλ€. μ΄λ ON μ μ UPDATE λ¬Έμ WHERE μ κ³Ό μ μ¬νκ² λμνλ€. μ΄λ‘ μΈν΄ μμμΉ λͺ»ν μλ¬κ° λ°μν μ μλ€.
ν μ€νΈλ₯Ό μν΄ μλμ ν μ΄λΈμ μμ±νμ.
-- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 VARCHAR2(1), c2 NUMBER); ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (c1);
-- 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 νμ΄ λ³ν©λμμ΅λλ€.
-- 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);
-- λΈλ‘νΉ
-- 4: S1 COMMIT; 컀λ°μ΄ μλ£λμμ΅λλ€.
-- 5: S2 ORA-00001: λ¬΄κ²°μ± μ μ½ μ‘°κ±΄(SCOTT.T1_PK)μ μλ°°λ©λλ€
μμ μ MERGE λ¬Έμ μλ μ½λμ μ μ¬νκ² λμνλ€. UPDATE λ¬Έμ WHERE μ μ consistent readλ‘ λμνλ€. S2 μΈμ μ MERGE λ¬Έμ UPDATE λμμ΄ μμ΄ INSERT λ¬Έμ΄ μννμ§λ§, S1 μΈμ μ΄ λμΌ PKλ‘ INSERT λ¬Έμ΄ μννκ³ μμ΄ λΈλ‘νΉμ΄ λ°μν κ²μ΄λ€.
-- 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;
-- 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 μ²λ¦¬κ° μ μμ μΌλ‘ μλ£λμμ΅λλ€.
-- 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;
/
-- λΈλ‘νΉ
-- 9: S1 COMMIT; 컀λ°μ΄ μλ£λμμ΅λλ€.
S2 μΈμ μ μλ¬κ° λ°μνμ§ μκ³ UPDATE λ¬Έμ΄ μνλλ€. μλ¬λ λ°μνμ§ μμ§λ§ UPDATE λ¬ΈμΌλ‘ μΈν΄ λμμ± μ νλ μ¬μ ν λ°μν μ μλ€λ μ μ μ£Όμν΄μΌ νλ€.
-- 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 |

