더북(TheBook)

패키지 커서 사용 시 주의점

패키지에서 선언한 커서는 변수처럼 세션이 살아있는 동안 공유되므로 패키지 커서를 사용할 때 주의해야 할 점이 있다. 지금까지 커서 사용 예제에서는 FOR문을 주로 사용했지만, LOOP나 WHILE문을 사용할 때는 “커서 열기-패치-닫기” 과정을 직접 명시해 줘야 한다. 그런데 패키지가 아닌 일반 함수나 프로시저에서는 커서를 굳이 닫지 않더라도 해당 서브 프로그램이 종료하면 커서는 자연스럽게 메모리에서 사라져 버린다. 하지만 패키지 커서는 자칫 커서를 닫는 것을 누락하면, 같은 세션에서 해당 커서를 재사용할 때 문제가 발생한다. 예제로 직접 확인해 보자.

입력

    DECLARE
      -- 커서 변수 선언
      dep_cur ch12_cur_pkg.pc_depname_cur%ROWTYPE;
    BEGIN
      -- 커서 열기
      OPEN ch12_cur_pkg.pc_depname_cur(30);

      LOOP
        FETCH ch12_cur_pkg.pc_depname_cur INTO dep_cur;
        EXIT WHEN ch12_cur_pkg.pc_depname_cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE ( dep_cur.department_id || ' - ' || dep_cur.department_name);
      END LOOP;
      -- 커서 닫기
      CLOSE ch12_cur_pkg.pc_depname_cur;
    END;

결과

    30 - 구매/생산부

앞의 예제에서는 커서를 닫는 부분을 일부러 주석처리 했다. 이제 동일한 블록을 재실행해 보자.

입력

    DECLARE
      -- 커서 변수 선언
      dep_cur ch12_cur_pkg.pc_depname_cur%ROWTYPE;
    BEGIN
     ...
     ...
    END;

결과

    ORA-06511: PL/SQL: 커서가 이미 열려있습니다.

커서가 이미 열려있다는 오류가 발생했다. 즉 이전 익명 블록에서 커서를 닫지 않은 상태로 있다가 다시 동일한 커서를 열려고 시도하니 오류가 발생한 것이다. 따라서 패키지 커서를 사용할 때는 반드시 사용이 끝나 후 커서를 닫는 것을 잊지 않아야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.