티스토리 뷰
급하게 다른 시스템의 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;
'지식정보' 카테고리의 다른 글
ORACLE 날짜함수 샘플 (0) | 2013.08.30 |
---|---|
ORACLE 레퍼런스 커서 타입 선언 (0) | 2013.07.29 |
JAVA 한글 MBCS(Multi Bytes Character Set) 해결 (0) | 2013.07.29 |
ORACLE Closing REF CURSOR (0) | 2013.04.04 |
ORACLE 에서 날짜를 문자열로 변환할 때 0을 제외하는 방법 (0) | 2013.03.07 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday