Oracle과 MS-SQL 사이의 Data 공유를 위해서 Openquery를 이용하고 있습니다. 지금까지 잘 이용하고 있었는데, 문제가 발생했습니다. Oracle DB를 Tibero로 바꾼다는거죠. 그래서 Tibero에서도 해당 기능을 사용할 수 있는지 점검해 봤습니다.
 Tibero to MSSQL Gateway라는게 존재하는데, 이는 설정을 따로 요청해야 하고, 기존의 MS-SQL측에서 생성된 프로시져를 쓸 수가 없다는 단점이 있어서 일단 Openquery를 이용하는 방법을 시도해봤습니다.

 MS-SQL에서 Linked server를 생성하는 방법에는 Tibero ODBC driver를 이용해서 Data 원본(DSN)을 만든 뒤에 이를 이용해서 Linked server를 생성하는 법과, Tibero oledb driver(2가지를 지원하더군요.)를 이용해서 바로 Linked server를 생성하는 방법이 있습니다.

 1. select query 실행
  ODBC, OLEDB 두가지 방법으로 모두 이상없이 잘 됩니다.

2. update query 실행
 ODBC, OLEDB 두가지 방법으로 모두 오류가 발생합니다.

결론.
 Openquery를 이용할 때 Tibero로는 select query만 실행 가능하다는 문제가 있습니다.
 MS-SQL에서 Oracle에 있는 Data에 접근하기 위한 방법으로 Openquery라는걸 소개한 적이 있죠.
기본적으로 제공하는 기능이라 좋긴 하지만 동적으로 쿼리를 만들어서 결과값을 받아올수 없다는 얘기를 한 적이 있습니다. 그렇게 되면 WHERE절 조건을 정확하게 줄 수 없으니 오라클 DB에 부하를 많이 주게 되겠죠.
저도 이렇게 알고 서비스 중인 MS-SQL과 Oracle 사이에 Data 동기화 프로시져를 만들었었습니다.
그런데....

 웬걸...

 회사에서 사용중인 MS-SQL 2005에서 혹시나 하는 마음에 문자열 변수에 커서를 정의하는 문장까지 포함해서 동적으로 쿼리를 만들어 주고, 커서를 열었더니... 결과 값이 정상적으로 나오네요. 앗싸~ 가오리~

아래와 같은 방식으로 처리하니까 동적으로 쿼리문장을 만들어서 실행시키고 결과값을 커서에 받아서 사용할 수 있습니다.


DECLARE @QUERY_STRING VARCHAR(1000)
DECLARE @CODE        VARCHAR(30)
SET @CODE='SUPERCODE'
DECLARE @USERNAME VARCHAR(50)

SET @QUERY_STRING = 'DECLARE ORA_CUR CURSOR FOR
                     SELECT USERNAME
                         FROM OPENQUERY(ORA_DB, ''SELECT USERNAME
                                FROM USER_INFO
                               WHERE CODE='''''+@CODE+''''' AND USER_FLAG=''''N'''' '') '

EXEC (@QUERY_STRING)
OPEN ORA_CUR
FETCH NEXT FROM ORA_CUR INTO @USERNAME

WHILE @@FETCH_STATUS = 0
    BEGIN
    INSERT INTO dbo.USER_INFO(USERNAME)
    VALUES(@USERNAME)

    FETCH NEXT FROM ORA_CUR INTO @USERNAME
  END;

CLOSE ORA_CUR

DEALLOCATE ORA_CUR

+ Recent posts