안녕하세요
항상 검색해서 조언을 구하다가 이렇게 글 올려봅니다.
문의:
A DB : 오라클11.2.0.4.0
B DB : 오라클11.1.0.7.0
A DB와 B DB 는 DB링크로 연결되어 있습니다.
그런데 A DB에서 프로시저를 호출하면 문제없이 실행되는데...
B DB에서 A DB프로시저를 호출할 때 변수에 널데이터가 있으면 실행이 안 됩니다.
예를 들어
B DB에 있는 프로시저명이 PROCEDURE1 이라고하면
B DB 에서 EXEC PROCEDURE1(변수1, 변수2, ''); 을 실행하면 문제없이 돌아가는데,
A DB에서 EXEC PROCEDURE1@DBLINK_B(변수1, 변수2, ''); 이렇게 실행하면 처리가 안 되고,
EXEC PROCEDURE1@DBLINK_B(변수1, 변수2, 변수3); 이렇게 널 없이 실행하면 처리가 됩니다.
DB 링크로 걸린 다른DB에 있는 프로시저를 호출할 때 널처리를 따로 해줘야 하는 걸까요?
아니면 널로 넘겨주는 변수문제가 아닌 다른게 있는건지 모르겠습니다.
혹시 owner 가 다르지만 동일한 명칭의 프로시저를 가지고 있지 않은지 확인이 먼저 필요할듯 합니다.
dblink로 연결된 권한으로 접근되는 owner 와 직접 내가 컨트롤하는 onwer 가 다를 경우에는 동일한 명칭이여도 다른 프로시저로 봐야 합니다.
네 동일한 명칭으로된 프로시저는 없구요...
DB링크에 걸린 프로시저를 그대로 가져와서
처리되는 SELECT, DELETE, INSERT, UPDATE 되는 테이블마다 @DBLINK를 붙여서 실행해서 널변수로 보내면
이건 또 실행이 됩니다...
B DB 의 procedure 의 파라메터가 어떻게 선언되어 있나요?
디폴트 값을 줘도 마찬가지 일까요??
procedure b_procedure(p1 IN VARCHAR2
,p2 IN VARCHAR2
,p3 IN VARCHAR2 DEFAULT NULL) IS
procedure b_procedure(p1 IN table_name.column%type
,p2 IN table_name.column%type
,p3 IN table_name.column%type) IS
이렇게 돼 있었는데,
이것저것 해보다가
procedure b_procedure(p1 IN table_name.column%type
,p2 IN table_name.column%type
,p3 IN varcha2 default null) IS
이렇게 해도 증상은 동일합니다.....
음... 그렇다면 이유가 명확하진 않네요.
혹시 모르니 실행시에 OWNER 도 같이 명시해서 실행 테스트 해보심이 좋을거 같습니다.
논리적으로는 동일한 프로시져가 다르게 작동하지는 않을거 같네요.
혹시 null인 파라미터로 집계함수를 사용하는 부분이 있나요? 디비링크 걸 경우에 null인경우에 집계함수를 사용할경우 에러나는 경우가 있더라구요.