Package 안에 여러 Procedure가 존재하고, 하나의 Main Procedure에서 각각의 Procedure 를 호출하고 있습니다.
Procedure에서 Cursor를 사용할 때, Exception시, Cursor를 Close해야 하나요?
프로그램을 간략히 설명드리겠습니다.
DB Link를 이용하여 Remote DB를 조회후 Cursor를 생성하여, Local DB에 값을 저장합니다.
정상인 경우에는 commit과 cursor close를 하지만, Exception시에는 rollback 코드만 있습니다.
Exception에 Cursor Close를 해야하는지 궁금합니다.
그리고, 각각의 Procedure 호출후에도 DB Link를 Close 해야 하는지요? 현재는 전체 프로그램의 종료 또는 Exception시에 Close 하고 있습니다.
DBA가 말하기를, Remote DB에 종료되지 않는 ACTIVE한 Session 이 너무 많이 남아 있다고 합니다. 질문을 드리는 가장 큰 이유는 이것입니다.
그러나 실행중에 Exception이 발생한 적은 없습니다.
질문을 요약하자면,
1. Procedure의 Exception 코드 내에 Close Cursor를 작성해야 하는지
2. DB Link를 이용하여 조회/저장 작업을 하는 각각의 Procedure내에 DB Link 를 Close 하는 코드를 작성해야 하는지
프로그램 코드를 첨부합니다. 고맙습니다.
CREATE OR REPLACE PACKAGE BODY sample_pkg IS
/********************************************************************************
* main_prc
********************************************************************************
PROCEDURE main_prc (
)
IS
BEGIN
-----------------------------------------------------------------------------
-- a_prc
-----------------------------------------------------------------------------
BEGIN
sample_pkg.a_prc();
EXCEPTION
WHEN OTHERS
THEN ROLLBACK;
RAISE_APPLICATION_ERROR (-20010, 'xxx');
END;
-----------------------------------------------------------------------------
-- b_prc
-----------------------------------------------------------------------------
BEGIN
sample_pkg.b_prc();
EXCEPTION
WHEN OTHERS
THEN ROLLBACK;
RAISE_APPLICATION_ERROR (-20010, 'xxx');
END;
-----------------------------------------------------------------------------
-- c_prc
-----------------------------------------------------------------------------
COMMIT;
DBMS_SESSION.CLOSE_DATABASE_LINK('sample_link'); --> Close DB Link
EXCEPTION
WHEN OTHERS
THEN ROLLBACK;
DBMS_SESSION.CLOSE_DATABASE_LINK('sample_link'); --> Close DB Link
END main_prc;
/********************************************************************************
* a_prc --> 각각의 Procedure내에 DB Link 를 Close 하는 코드를 작성해야 하나요?
********************************************************************************
PROCEDURE a_prc (
)
IS
CURSOR sample_cur IS
SELECT a
,b
FROM remote_table@sample_link --> DB Link 사용
;
BEGIN
OPEN sample_cur;
LOOP
FETCH sample_cur BULK COLLECT INTO sample_type LIMIT 3000;
FORALL i IN sample_type.FIRST..sample_type.LAST
INSERT INTO local_table (
a
,b
) VALUES (
sample_type(i).a
,sample_type(i).b
);
COMMIT;
EXIT WHEN sample_cur%NOTFOUND;
END LOOP;
CLOSE sample_cur; --> Close Cursor!!!
EXCEPTION
WHEN OTHERS
THEN ROLLBACK; --> 여기에서도 Cursor를 Close해야 하나요?
RAISE;
END;
END sample_pkg;
|