오라클 간에 DB링크를 통한 호출 시 에러 발생...이래저래 종일 찾아봐도 모르겠습니다. 0 0 8,128

by 메로나 [PL/SQL] [2025.02.07 15:08:22]


DB1, DB2, DB3 3개의 오라클 DB가 깔린 서버가 있습니다.

DB1 : 오라클 11g, NLS_CHARACTERSET (AL32UTF8)
DB2 : 오라클 11g, NLS_CHARACTERSET (AL32UTF8)
DB3 : 오라클 9i, NLS_CHARACTERSET (KO16KSC5601)


DB1 에는 프로시저 A, B  2개 있습니다. 그리고 DB2와 DB3를 바라보는 각DB링크가 존재합니다.
프로시저 처리 코드는 동일 합니다.
DB1의 A프로시저 역할은 DB2의 X테이블의 데이터를 읽어서 값을 DB1의 특정테이블에 값을 INSERT하는겁니다.
DB1의 B프로시저 역할은 DB3의 X테이블의 데이터를 읽어서 값을 DB1의 특정테이블에 값을 INSERT하는겁니다.
차이점이라면 DB2 와 DB3의 DB링크 차이입니다.


----------------------
    DB1의 프로시저 A
----------------------
 FOR rec  IN  ( SELECT * FROM X@DB_LINK_DB2)
 LOOP
     INSERT ....
 END 

----------------------
    DB1의 프로시저 B
----------------------
 FOR rec  IN  ( SELECT * FROM X@DB_LINK_DB3)
 LOOP
     INSERT ....
 END 


프로시저 B가 호출 시 에러가 납니다.
ora-12705: invalid or unknown nls parameter value specified 
ora-02063: preceding line from erpprd

그런데 현재 오라클 9i를 사용하는 DB3의 NLS_LANG은 바꿔줄 수가 없다고 합니다.

구글 검색하다 보니 프로시저 호출 전

    ALTER SESSION SET NLS_CHARACTERSET=''KO16KSC5601'

을 처리하고 하면 된다고 해서

저 FOR문 앞에서

----------------------
    DB1의 프로시저 B
----------------------

 EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CHARACTERSET=''KO16KSC5601'';';


 FOR rec  IN  ( SELECT * FROM X@DB_LINK_DB3)
 LOOP
     INSERT ....
 END 

 

를 해봤는데 

   ORA-00922: missing or invalid option

가 나구요. 찾다보니 또 어느분께서 NLS_CHARACTERSET 는 SESSION 에서 바꿀 수 있는 항목이 아니라고 해서요 ㅠㅠ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입