기술 정보
home
채널 소개
home

DBLINK 우회 방안 (한 프로시저 내 다수DML 존재)

문서 유형
기술 정보
분야
인터페이스/연동
키워드
dblink
dml
1 more property

개요

Oracle에서 Tibero로의 DBLink에서 다수의 DML이 하나의 프로시저에 존재할 경우, 독립적으로 Commit 또는 Rollback 되도록 트랜잭션을 관리하는 방안을 안내합니다.
주의
본 문서에서 안내하는 기능은 프로시저 내에서 오류가 발생해도 Commit 또는 Rollback을 수행합니다.
해당 기능 사용 시 프로시저의 트랜잭션 단위가 독립되어, 데이터 정합성이 깨질 가능성이 존재합니다.

방법

‘PRAGMA AUTONOMOUS_TRANSACTION’를 사용해 해당 문장이 포함된 프로시저가 독립적으로 Commit 또는 Rollback 될 수 있도록 적용 합니다.

테스트 테이블 생성

Oracle

CREATE TABLE T8_ORA (CD CHAR(1),CD_NO NUMBER, TEXT VARCHAR2(20)); CREATE TABLE T9_ORA (CD CHAR(1),CD_NO NUMBER, TEXT VARCHAR2(20)); CREATE TABLE T10_ORA (CD CHAR(1),CD_NO NUMBER, TEXT VARCHAR2(20)); INSERT INTO T8_ORA VALUES (‘A’,1,’ORACLE1′); INSERT INTO T8_ORA VALUES (‘B’,1,’ORACLE1′); INSERT INTO T8_ORA VALUES (‘C’,1,’ORACLE1′); COMMIT; INSERT INTO T9_ORA VALUES (‘A’,1,’ORACLE2′); INSERT INTO T9_ORA VALUES (‘E’,1,’ORACLE2′); INSERT INTO T9_ORA VALUES (‘F’,1,’ORACLE2′); COMMIT; INSERT INTO T10_ORA VALUES (‘G’,1,’ORACLE3′); INSERT INTO T10_ORA VALUES (‘H’,1,’ORACLE3′); INSERT INTO T10_ORA VALUES (‘I’,1,’ORACLE3′); COMMIT; TRUNCATE TABLE T9_ORA;
SQL
복사

Tibero

CREATE TABLE T7_TIB (CD CHAR(1) , CD_NO NUMBER , TEXT VARCHAR(20)); CREATE TABLE T8_TIB (CD CHAR(1) , CD_NO NUMBER , TEXT VARCHAR(20)); INSERT INTO T8_TIB VALUES (‘C’,2,’TIBERO’); INSERT INTO T8_TIB VALUES (‘C’,2,’TIBERO2′); INSERT INTO T8_TIB VALUES (‘C’,2,’TIBERO3′);
SQL
복사

우회 전 쿼리

DECLARE BEGIN FOR I IN (SELECT * FROM T8_ORA) LOOP INSERT INTO T7_TIB@OT_0627 VALUES (I.CD, I.CD_NO,I.TEXT); END LOOP; FOR I2 IN (SELECT * FROM T9_ORA) LOOP INSERT INTO T7_TIB@OT_0627 VALUES (I2.CD, I2.CD_NO,I2.TEXT); END LOOP; FOR I3 IN (SELECT * FROM T10_ORA) LOOP INSERT INTO T7_TIB@OT_0627 VALUES (I3.CD, I3.CD_NO,I3.TEXT); END LOOP; FOR I4 IN (SELECT A.CD , B.CD_NO,B.TEXT FROM T8_ORA A, T8_TIB@OT_0627 B WHERE A.CD=B.CD) LOOP UPDATE T7_TIB@OT_0627 A SET A.CD = ‘A’ WHERE A.CD = I4.CD; END LOOP; COMMIT; END; /
SQL
복사
참고
UPDATE 부분에서 예외 발생후 02055 오류가 발생합니다.
분산 트랜잭션에 의한 업데이트를 허용하지 않습니다.

우회 후 쿼리

CREATE OR REPLACE PROCEDURE SP_GET_UPDATE AS BEGIN FOR I4 IN (SELECT A.CD , B.CD_NO,B.TEXT FROM T8_ORA A, T8_TIB@OT_0627 B WHERE A.CD=B.CD) LOOP UPDATE T7_TIB@OT_0627 A SET A.CD = ‘Z’ WHERE A.CD = I4.CD; END LOOP; COMMIT; END; CREATE OR REPLACE PROCEDURE FN_DIS_TEST AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN FOR I IN (SELECT * FROM T8_ORA) LOOP INSERT INTO T7_TIB@OT_0627 VALUES (I.CD, I.CD_NO,I.TEXT); END LOOP; FOR I2 IN (SELECT * FROM T9_ORA) LOOP INSERT INTO T7_TIB@OT_0627 VALUES (I2.CD, I2.CD_NO,I2.TEXT); END LOOP; FOR I3 IN (SELECT * FROM T10_ORA) LOOP INSERT INTO T7_TIB@OT_0627 VALUES (I3.CD, I3.CD_NO,I3.TEXT); END LOOP; SP_GET_UPDATE; COMMIT; END; /
SQL
복사
참고
마지막 UPDATE 부분을 프로시저로 분리 후 본 프로시저를 자율 트랜잭션에 맡깁니다.