티스토리 뷰

급하게 다른 시스템의 DB서버에서 데이터 목록을 가져와서 활용해야 하는 일이 주어졌다. 보통은 API 를 작성해야 하지만 각 시스템에 API를 작성하여 적용할 시간이 부족한 관계로 DB Link를 통하여 레퍼런스 커서로 데이터를 가져오는 개발을 진행하였기에 그 기록을 남깁니다.

미리 이야기 하지만 이 방식은 절대 절대 추천하지 않습니다. 가장 큰 이유는 각 시스템 DB서버에 영향을 끼칠 가능성이 매우 크기 때문에 위험한 방식입니다.

 

우선 원격의 대상 DB에 레퍼런스 커서를 리턴해줄 프로시저 생성 합니다.

PROCEDURE 프로시저명 (

io_cur IN OUT NUMBER

) IS 
mySql varchar2(1000) := 'SELECT * FROM TAB';
rc						NUMBER;
BEGIN

io_cur := DBMS_SQL.open_cursor;
	     DBMS_SQL.parse(
                    io_cur,
                    mySql,
                    DBMS_SQL.native
           );
		DBMS_SQL.Bind_Variable( io_cur, '파인드변수1', 값1);
 	  rc := DBMS_SQL.Execute( io_cur );
END;

END 프로시저명;

 

내 시스템 DB서버에서 다음과 같이 활용합니다. Procedure 에서 활용하든 Java에서 호출하든 알아서 하면 되지만 반드시 커서를 종료해 줘야 합니다. 

DECLARE
v_cur NUMBER;
v1 varchar2(10);
v2 varchar2(100);
v3 varchar3(20);
v4 varchar4(30);
BEGIN
프로시저명@링크명(v_cur);
DBMS_SQL.define_column@링크명( v_cur, 1, v1, 10 );
DBMS_SQL.define_column@링크명( v_cur, 2, v2, 100 );
DBMS_SQL.define_column@링크명( v_cur, 3, v3, 20 );
DBMS_SQL.define_column@링크명( v_cur, 4, v4, 30 );
LOOP
EXIT WHEN DBMS_SQL.Fetch_Rows@링크명( v_cur ) = 0;
DBMS_SQL.column_value@링크명( v_cur, 1, v1 );
DBMS_SQL.column_value@링크명( v_cur, 2, v2 );
DBMS_SQL.column_value@링크명( v_cur, 3, v3 );
DBMS_SQL.column_value@링크명( v_cur, 4, v4 );  
	

	END LOOP;

	DBMS_SQL.CLOSE_CURSOR@링크명(v_cur);  
END;

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday