1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (186)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (26)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

[PL/SQL] 기타 패키지 특징
📃 DATABASE/ORACLE

[PL/SQL] 기타 패키지 특징

2018. 2. 22. 11:33

기타 패키지 특징

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;
Colored by Color Scripter
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;
Colored by Color Scripter
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;
Colored by Color Scripter
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;
Colored by Color Scripter
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;
Colored by Color Scripter
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;
Colored by Color Scripter
cs



1
2
3
4
BEGIN
    CH12_OVERLOAD_PKG.GET_DEP_NM_PROC(176);
    CH12_OVERLOAD_PKG.GET_DEP_NM_PROC('Jonathon Taylor');
END;
Colored by Color Scripter
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
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [PL/SQL] 다중 로우를 처리하는 동적 SQL문
    • [PL/SQL] 동적 SQL
    • [PL/SQL] 패키지 데이터
    • [PL/SQL] 패키지(PACKAGE)
    1HOON
    1HOON

    티스토리툴바