Oracle 에서 Tibero 로의 DBLink 사용 시 제약이 있을 수 있는 사항들에 대해 우회하여 처리할 수 있는 방안을 안내합니다.
다수의 DML이 하나의 프로시저에 존재할 경우 트랜잭션 관리
PRAGMA AUTONOMOUS_TRANSACTION 사용
PRAGMA AUTONOMOUS_TRANSACTION를 사용해 해당 문장이 속한 프로시저의 경우 독립적으로 COMMIT 또는 ROLLBACK이 되도록 합니다.
Note!
이 기능은 프로시저 내에서 에러가 나도 COMMIT 또는 ROLLBACK 하는 기능입니다.
이 기능을 사용할 경우, 프로시저의 트랜잭션 단위가 독립되어 데이터 정합성이 깨질 가능성도 존재합니다.
–테스트 테이블 생성
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;
–테스트 테이블 생성
–티베로
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′);
— 우회 전 쿼리
(UPDATE 부분에서 예외 발생후 02055 에러 발생 분산 트랜잭션에 의한 업데이트 허용 안함)
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;
/
— 우회 후 쿼리
(마지막 UPDATE 부분을 프로시저로 분리 후 원 프로시저를 자율 트랜잭션에 맡김)
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;
/