[운영 종료] TmaxTibero Tech Blog

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

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

인터페이스, 연동

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

TmaxTiberotech 2023. 8. 16. 15:33

Oracle 에서 Tibero 로의 DBLink 사용 시 제약이 있을 수 있는 사항들에 대해 우회하여 처리할

있는 방안을 안내합니다.

Oracle에서 Tibero로 insert 시 select 절 sysdate 함수 사용

Oracle to Tibero Link 를 사용한 insert ~ select 수행에서 insert 테이블은 Tibero, select

테이블은 Oracle 에 있을 경우와 select 문에 sysdate 함수를 사용 할 경우 제약이 있을 시

아래와 같은 우회 방안을 안내합니다.

 

Note!

쿼리 전체를 LINK에 적용해 remote에서 수행할 수 있는 기능을 가진
Oracle 의 DBMS_HS_PASSTHROUGH 패키지를 사용했습니다.

1. 쿼리 전체를 Tibero로 옮긴 후 Tibero to Oracle LINK 사용한 insert 수행

-- 테스트 테이블 생성

DROP TABLE T3_TIB;
CREATE TABLE T3_TIB (LAST_MOD_TS DATE);
 
DROP TABLE T3_ORA;
CREATE TABLE T3_ORA (TM_STMP DATE);
INSERT INTO T3_ORA VALUES (SYSDATE);
INSERT INTO T3_ORA VALUES (SYSDATE);
INSERT INTO T3_ORA VALUES (SYSDATE);
INSERT INTO T3_ORA VALUES (SYSDATE);

 

--우회 전 쿼리

INSERT INTO T3_TIB@OT_0627
                 (
                                    LAST_MOD_TS
                         )
                 (
                 SELECT
                                    SYSDATE AS LAST_MOD_TS
                              FROM T3_ORA
                 WHERE
                 );

 

--우회 후 쿼리

DECLARE
C CHAR;
NR CHAR;
BEGIN
C := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@OT_0627;
DBMS_HS_PASSTHROUGH.PARSE@OT_0627(C,'
INSERT INTO T3_TIB
                                  (
                                          LAST_MOD_TS
                                  )
                                  (SELECT
                                                   SYSDATE AS LAST_MOD_TS
                                         FROM T3_ORA@TO_0627
                                         WHERE TO_CHAR(TM_STMP,''YYYYMMDD'')>20200627)');
NR := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@OT_0627(C);
DBMS_OUTPUT.PUT_LINE(NR||' ROW INSERTED.');
DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@OT_0627(C);
commit;
END;
/

2. DBMS_HS_PASSTHROUGH 사용방안 2

-- 테스트 테이블 생성

CREATE TABLE T3_TIB (CD CHAR(1) , CD_NO NUMBER , TEST_TEXT VARCHAR(20));
INSERT INTO T3_TIB VALUES ('A',1,'ORACLE');
INSERT INTO T3_TIB VALUES ('A',2,'ORACLE');
INSERT INTO T3_TIB VALUES ('A',3,'ORACLE');
INSERT INTO T3_TIB VALUES ('B',4,'ORACLE');
INSERT INTO T3_TIB VALUES ('C',5,'ORACLE');
 
CREATE TABLE T3_ORA (ORA_CD CHAR(1) , ORA_CD_NO NUMBER);
INSERT INTO T3_ORA VALUES ('A',1);
INSERT INTO T3_ORA VALUES ('A',1);
INSERT INTO T3_ORA VALUES ('B',2);
INSERT INTO T3_ORA VALUES ('B',3);
INSERT INTO T3_ORA VALUES ('C',1);
 
DECLARE
C CHAR;
NR CHAR;
BEGIN
C := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@OT_0627;
DBMS_HS_PASSTHROUGH.PARSE@OT_0627(C,'
UPDATE T3_TIB T
               SET T.TEST_TEXT=''TIBERO''
WHERE (T.CD, T.CD_NO) IN
(SELECT * FROM T3_ORA@TO_0627 WHERE ORA_CD=''A'' AND ORA_CD_NO < 3)');
NR := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@OT_0627(C);
DBMS_OUTPUT.PUT_LINE(NR||' ROW UPDATE.');
DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@OT_0627(C);
commit;
END;
/