[운영 종료] TmaxTibero Tech Blog

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

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

인터페이스, 연동

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

TmaxTiberotech 2023. 8. 16. 15:58

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

수 있는 방안을 안내합니다.

Oracle에서 Tibero Link 사용 시 AND 절의 컬럼 사용

Oracle to Tibero Link 에서 복수개의 AND 절 컬럼 사용 시 제약이 있을 경우 아래와 같은

우회 방안을 안내합니다.

CURSOR에 select 절 전체의 결과를 담아 놓고 그 결과를 이용한 쿼리 수행

-- 테스트 테이블 생성
--티베로

CREATE TABLE T4_TIB (TEST_NO NUMBER, TEST_TEXT VARCHAR(20), UPD_CD VARCHAR(2));
INSERT INTO T4_TIB VALUES (1,'ORACLE','N');
INSERT INTO T4_TIB VALUES (2,'ORACLE','N');
INSERT INTO T4_TIB VALUES (3,'ORACLE','N');
INSERT INTO T4_TIB VALUES (4,'ORACLE','N');

 

-- 오라클

CREATE TABLE T4_ORA (CD CHAR, ORA_TEST_NO NUMBER, ORA_TEST_TEXT VARCHAR(20));
INSERT INTO T4_ORA VALUES ('A',1,'ORACLE');
INSERT INTO T4_ORA VALUES ('A',2,'ORACLE');
INSERT INTO T4_ORA VALUES ('A',3,'ORACLE');
INSERT INTO T4_ORA VALUES ('A',4,'ORACLE');
 
CREATE TABLE T4_ORA_2 (CD_2 CHAR, ORA_TEST_NO_2 NUMBER, ORA_TEST_TEXT_2 VARCHAR(20));
INSERT INTO T4_ORA_2 VALUES ('A',1,'ORACLE');
INSERT INTO T4_ORA_2 VALUES ('A',2,'ORACLE');
INSERT INTO T4_ORA_2 VALUES ('B',3,'ORACLE');
INSERT INTO T4_ORA_2 VALUES ('B',4,'ORACLE');

 

-- 우회 전 쿼리

UPDATE T4_TIB@OT_0627 T
                   SET UPD_CD = 'Y'
         WHERE 1=1
           AND (T.TEST_NO, T.TEST_TEXT,T.UPD_CD)
                           IN (
                                              SELECT A.ORA_TEST_NO
                                                        ,A.ORA_TEST_TEXT
                                                        ,'N' UPD_CD
                                                      FROM T4_ORA A,
                                                                 T4_ORA_2 B
                                                      WHERE A.CD = B.CD_2
                                )

 

-- 우회 후 쿼리

DECLARE
CURSOR B_CUR IS (            SELECT distinct A.ORA_TEST_NO
                                                           ,A.ORA_TEST_TEXT
                                                           ,'N' UPD_CD
                                                         FROM T4_ORA A,
                                                                     T4_ORA_2 B
                                                         WHERE A.CD=B.CD_2
                                   );
BEGIN
          FOR C_CUR IN B_CUR
          LOOP
                  UPDATE T4_TIB@OT_0627 T
                  SET UPD_CD = 'Y'
                  WHERE TEST_NO = C_CUR.ORA_TEST_NO
                     AND TEST_TEXT = C_CUR.ORA_TEST_TEXT
                     AND UPD_CD = C_CUR.UPD_CD;
                  COMMIT;
          END LOOP;
END;
/

Oracle에서 Tibero 함수 호출

Oracle to Tibero Link 를 사용한 Tibero의 함수 호출 시 제약이 있을 경우 아래와 같은 우회

방안을 안내합니다.

Tibero에 Oracle의 컬럼을 select 할 수 있는 view 생성

Note!

Oracle에서 Tibero 의 view 를 조회하면 LINK의 LINK 를 거쳐 결과 값이 나오도록 우회했습니다.
view 생성 시 Tibero는, varchar2의 경우 최대 크기(65536)로 할당되어 오라클 쪽에서 LONG
타입으로 인식됩니다. view 생성 시 CAST 함수로 컬럼 길이를 제한하는 방법으로 우회
가능합니다.

-- 테스트 함수 생성

CREATE OR REPLACE FUNCTION FN_T5_TEST RETURN NUMBER
IS
V_NUMBER NUMBER;
BEGIN
SELECT FUNC_NO INTO V_NUMBER FROM T1_TIB;
RETURN V_NUMBER;
END;
/
DROP FUNCTION FN_T5_TEST
CREATE OR REPLACE FUNCTION FN_T5_TEST_2 RETURN VARCHAR2
IS
V_TEXT VARCHAR2(20);
BEGIN
SELECT 'ORACLE' INTO V_TEXT FROM DUAL;
RETURN V_TEXT;
END;
/

 

-- 우회 전 쿼리

SELECT FN_T5_TEST AS NUM, FN_T5_TEST_2 AS TEXT FROM DUAL@OT_0627;

 

-- 우회 후 쿼리

CREATE OR REPLACE VIEW VW_T5_TEST AS
SELECT FN_T5_TEST AS NUM , cast(FN_T5_TEST_2 as varchar(20)) AS TEXT FROM DUAL;
 
select *
from t4_ora
where ORA_TEST_TEXT in (SELECT text FROM VW_T5_TEST@OT_0627);