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이(가) 컴파일되었습니다.