[운영 종료] TmaxTibero Tech Blog

티맥스티베로 공식 블로그는 https://tmaxtibero.blog/ 로 이전되었습니다.

티맥스티베로 공식 블로그 이전 자세히보기

인터페이스, 연동

[Tibero] DBLINK 우회방안_Oracle to Tibero (4)

TmaxTiberotech 2023. 8. 16. 16:26

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;
/