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 |