더북(TheBook)

04 | 기타 패키지 특징

PRAGMA SERIALLY_REUSABLE 옵션

패키지에 변수와 상수, 커서 예외 등을 선언하면 세션이 살아있는 동안 그 값이 공유된다고 했는데, 그렇다면 이러한 값은 어딘가에 저장되어 있을 것이다. 패키지 데이터가 저장되어 있는 공간을 UGA(User Global Area)라고 하는데 UGA란 오라클에서 사용하는 내부 메모리 공간 중 하나로 주로 세션에 관한 정보를 갖고 있다. 즉 세션이 생길 때마다 UGA가 하나씩 생성된다. 그런데 시스템에 접속하는 사용자 수가 많아지면 자연스럽게 세션 수도 증가할 것이고 이로 인해 UGA 수도 많아지므로, 패키지 데이터를 많이 사용하면 메모리 낭비를 초래할 수 있다. 또한 굳이 세션별로 패키지 데이터 값을 공유할 필요가 없는 경우도 있을 것이다.

세션이 아닌 호출 단위별로 패키지 데이터를 사용할 수 있는 방법이 있다. 즉 세션별로 값을 공유하지 않는다는 말이다. 8장에서 PRGAMA란 키워드를 소개했는데 이 키워드와 함께 사용할 수 있는 옵션은 총 5개였다. 그 중 하나인 “PRAGMA SERIALLY_REUSABLE”를 패키지 선언부와 본문에 명시하면, 해당 패키지 데이터는 호출이 끝나면 다시 초기화되어 같은 세션에 있더라도 값을 공유하지 않는다. 이전 예제에서 사용했던 ch12_col_pkg에 이 옵션을 추가해 보자.

입력

    CREATE OR REPLACE PACKAGE ch12_col_pkg IS
      PRAGMA SERIALLY_REUSABLE;
      -- 중첩 테이블 선언
      TYPE nt_dep_name IS TABLE OF VARCHAR2(30);
      -- 중첩 테이블 변수 선언 및 초기화
      pv_nt_dep_name nt_dep_name := nt_dep_name();
      -- 선언한 중첩 테이블에 데이터 생성 프로시저
      PROCEDURE make_dep_proc ( p_par_id IN NUMBER) ;
    END ch12_col_pkg;

결과

    PACKAGE CH12_COL_PKG이(가) 컴파일되었습니다.

입력

    CREATE OR REPLACE PACKAGE BODY ch12_col_pkg IS
      PRAGMA SERIALLY_REUSABLE;
      -- 선언한 중첩 테이블에 데이터 생성 프로시저
      PROCEDURE make_dep_proc ( p_par_id IN NUMBER)
      IS
      BEGIN
        -- 부서 테이블의 PARENT_ID를 받아 부서명을 가져 옴
        FOR rec IN ( SELECT department_name
                       FROM departments
                      WHERE parent_id = p_par_id )
        LOOP
          -- 중첩 테이블 변수 EXTEND
          pv_nt_dep_name.EXTEND();
          -- 중첩 테이블 변수에 데이터 넣기
          pv_nt_dep_name( pv_nt_dep_name.COUNT) := rec.department_name;
        END LOOP;
      END make_dep_proc;
    END ch12_col_pkg;

결과

    PACKAGE BODY CH12_COL_PKG이(가) 컴파일되었습니다.
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.