기타 패키지 특징
PRAGMA SERIALLY_REUSABLE 옵션
세션이 유지되고있는 동안 패키지 데이터가 저장되있는 공간을 UGA(USER GLOBAL AREA)라고 하는데, 세션이 생길 때마다 하나씩 생성된다.
그런데 사용자가 많아지면 많은 UGA가 생길것이고, 페키지 데이터를 많이 사용하면 메모리 낭비를 초래할 수 있다.
세션이 아닌 호출 단위별로 패키지 데이터를 사용할 수 있는 방법이 있는데 PRAGMA SERIALLY_REUSABLE이 그것이다.
PRAGMA SERIALLY_REUSABLE를 패키지 선언부와 본문에 명시하면 해당 패키지 데이터는 호출이 끝나면 다시 초기화되어 같은 세션에 있더라도 값을 공유하지 않는다.
1 2 3 4 5 6 7 | 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; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CREATE OR REPLACE PACKAGE BODY CH12_COL_PKG IS PRAGMA SERIALLY_REUSABLE; PROCEDURE MAKE_DEP_PROC (P_PAR_ID IN NUMBER) IS BEGIN FOR REC IN (SELECT DEPARTMENT_NAME FROM DEPARTMENTS WHERE PARENT_ID = P_PAR_ID) LOOP 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; | cs |
1 2 3 4 5 6 7 8 | BEGIN CH12_COL_PKG.MAKE_DEP_PROC(100); FOR IDX IN 1..CH12_COL_PKG.PV_NT_DEP_NAME.COUNT LOOP DBMS_OUTPUT.PUT_LINE(CH12_COL_PKG.PV_NT_DEP_NAME(IDX)); END LOOP; END; | cs |
1 2 3 4 5 6 7 | BEGIN -- 프로시저를 실행하지 않는다. FOR IDX IN 1..CH12_COL_PKG.PV_NT_DEP_NAME.COUNT LOOP DBMS_OUTPUT.PUT_LINE(CH12_COL_PKG.PV_NT_DEP_NAME(IDX)); END LOOP; END; | cs |
패키지 데이터를 공유시키지 않았기 때문에 세션이 유지되었지만 값은 존재하지 않는다.
오버로딩
동일한 이름이지만 매개변수 타입이나 개수가 다르면 함수를 여러개 정의해 만들어 사용할 수 있는 특징을 말한다.
오라클에서도 패키지에 선언한 함수나 프로시저에 한해 오버로딩을 지원한다.
1 2 3 4 | CREATE OR REPLACE PACKAGE CH12_OVERLOAD_PKG IS PROCEDURE GET_DEP_NM_PROC (P_EMP_ID IN NUMBER); PROCEDURE GET_DEP_NM_PROC (P_EMP_NAME IN VARCHAR2); END CH12_OVERLOAD_PKG; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | CREATE OR REPLACE PACKAGE BODY CH12_OVERLOAD_PKG IS PROCEDURE GET_DEP_NM_PROC (P_EMP_ID IN NUMBER) IS VS_DEP_NM DEPARTMENTS.DEPARTMENT_NAME%TYPE; BEGIN SELECT B.DEPARTMENT_NAME INTO VS_DEP_NM FROM EMPLOYEES A, DEPARTMENTS B WHERE A.EMPLOYEE_ID = P_EMP_ID AND A.DEPARTMENT_ID = B.DEPARTMENT_ID; DBMS_OUTPUT.PUT_LINE('EMP_ID : ' || P_EMP_ID || ' - ' || VS_DEP_NM); END GET_DEP_NM_PROC; PROCEDURE GET_DEP_NM_PROC (P_EMP_NAME IN VARCHAR2) IS VS_DEP_NM DEPARTMENTS.DEPARTMENT_NAME%TYPE; BEGIN SELECT B.DEPARTMENT_NAME INTO VS_DEP_NM FROM EMPLOYEES A, DEPARTMENTS B WHERE A.EMP_NAME = P_EMP_NAME AND A.DEPARTMENT_ID = B.DEPARTMENT_ID; DBMS_OUTPUT.PUT_LINE('EMP_NAME : ' || P_EMP_NAME || ' - ' || VS_DEP_NM); END GET_DEP_NM_PROC; END CH12_OVERLOAD_PKG; | cs |
1 2 3 4 | BEGIN CH12_OVERLOAD_PKG.GET_DEP_NM_PROC(176); CH12_OVERLOAD_PKG.GET_DEP_NM_PROC('Jonathon Taylor'); END; | cs |
반응형
'📃 DATABASE > ORACLE' 카테고리의 다른 글
[PL/SQL] 다중 로우를 처리하는 동적 SQL문 (0) | 2018.03.19 |
---|---|
[PL/SQL] 동적 SQL (0) | 2018.03.01 |
[PL/SQL] 패키지 데이터 (0) | 2018.02.21 |
[PL/SQL] 패키지(PACKAGE) (1) | 2018.02.19 |
[PL/SQL] 사용자 정의 타입 (2) | 2018.02.12 |