ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PL/SQL] 패키지(Package)
    IT, 프로그래밍/Database (Oracle) 2019. 1. 25. 09:00



    패키지 (Package) : 논리적 연관성이 있는 PL/SQL 타입, 변수, 상수, 서브 프로그램, 커서, 예외 등의 항목을 묶어 놓은 객체.

    컴파일 과정을 거쳐 DB에 저장되고, 다른 프로그램 (타 패키지, 프로시저, 외부 프로그램 등)에서 패키지의 항목을 참조, 공유, 실행할 수 있다.


    PL/SQL의 패키지는 자바의 Class 개념과 유사한데, 논리적 연관성이 있는 프로시저와 함수, 변수와 상수등을 정의한 부분에서 그러하다. 다만 자바에서 지원하는 상속의 개념은 없다.


    패키지의 장점을 정리하면 아래와 같다.


    1. 모듈화 기능

    2. 프로그램 설계의 용이성

    3. 캡슐화

    4. 성능 최적화 (메모리에 패키지 전체가 올라가 있으므로 안에 있는 부 프로그램 호출시 빠른 처리 가능)




    패키지 구조




    PL/SQL은 선언부와 본문이 나누어지며, 선언부에는 사용할 상수와 메소드, 함수와 프로시저의 시그니처만을 작성하고 구체적인 구현부는 본문에 작성한다는 것을 유의하자.


    또한, 선언부는 다른 사용자들이 접근이 가능하나, 본문에는 반드시 패키지 소유자만 접근을 할 수 있다는 점을 알아두자!


    선언부(Specification) : 패키지에서 사용할 사용자 정의 타입, 변수, 상수, 예외, 서브 프로그램의 골격을 선언.

    함수와 프로시저는 시그니처(Signature)만 존재할 뿐, 안에 내용은 작성하지 않는다.

    해당 패키지 소유자 외의 다른 사용자는 선언부의 내용만 볼 수 있지만, 사용하려는 함수나 프로시저에 대해 필요한 모든 정보(함수와 프로시저의 시그니처)를 참조할 수 있으므로 사용하는데는 전혀 문제가 없다.



    CREATE OR REPLACE PACKAGE 패키지명 IS

    TYPE_구문;

    상수명 CONSTANT 상수_타입;

    예외명 EXCEPTION;

    변수명 변수_타입;

    커서 구문;


    FUNCTION 함수명 (매개변수 IN 타입, 매개변수 IN 타입 ... )

    RETURN 반환 타입;



    PROCEDURE 프로시저명 (매개변수 [ IN, OUT, INOUT ] 타입, 매개변수 [ IN, OUT, INOUT ] 타입 ... );


    ...


    END 패키지명




    패키지 본문(Body) : 여기서 유의할 것은 패키지 본문에서 선언한 상수나 변수는 외부에서 참조할 수 없다는 점이다. 패키지 본문의 내용은 패키지 작성자만 접근해 수정이 가능하며, 다른 사용자는 전혀 볼수가 없다.




    CREATE OR REPLACE PACKAGE BODY 패키지명 IS

    상수명 CONSTANT 상수_타입;

    변수명 변수_타입;

    커서 정의 구문;


    FUNCTION 함수명 (매개변수 IN 매개변수 타입, 매개변수 IN 매개변수 타입, .... )

    RETURN 반환타입



    IS 

    ...

    BEGIN 

    ...

    END 함수명;


    PROCEDURE 프로시저명 (매개변수 [ IN, OUT, INOUT ] 매개변수 타입, 매개변수 [ IN, OUT, INOUT ] 매개변수 타입,  ....)

    IS

    ...

    BEGIN

    ...

    END 프로시저명;

    ...

    END 패키지명;



    패키지를 사용할 때는,


    패키지명.서브프로그램명


    패키지명.변수명


    패키지명.상수명


    으로 사용한다.





    패키지에서 선언한 변수(+상수)의 특징




    1. 패키지 선언부에 선언한 변수는 외부에서 접근하고 수정할 수 있다. 이를 공용항목 (Public Item) 이라고 한다.

    2. 패키지에서 선언한 변수는 그 값이 세션이 살아있는 동안 유지된다. 블록의 종료와 함께 소멸하는것이 아니다.

    3. 패키지 본문에 선언한 변수나 상수는 외부에서 접근할 수 없다. 이를 내부(전용) 항목 (Private Item) 이라고 한다. 그러나, 직접 참조를 못할 뿐이지 서브 프로그램을 통해 간접적으로 참조하거나 값도 변경할 수 있다.



    패키지 내에서의 커서의 사용




    패키지 내에서 선언한 커서는 세션이 살아있는 동안 유지된다. 변수는 값이 유지되지만 커서는 그 상태까지 유지가 된다.


    패키지 내부에서 사용되는 형태


    1. 패키지 선언부에 커서 전체를 선언하는 형태

    선언부에 커서 전체를 선언하면 공용이 되어 패키지명.커서명 으로 접근이 가능하다.


    2. 쿼리를 제외한 커서 헤더 부분만 선언하는 형태

    커서 헤더만 선언부에 명시하면, 해당 커서의 쿼리는 본문에서 작성할 수 있고 구현부인 쿼리를 외부에 숨길 수 있다.


    헤더부분만 선언할 때는 커서가 반환, 패치하는 데이터를 가리키는 RETURN 절을 명시해야 한다.

    구현부의 결과로 반환되는 컬럼 타입을 RETURN절에 함꼐 적어주어야 하는데, %ROWTYPE으로 명시할 수도 있고 사용자 정의 레코드 타입을 명시하는 것이 있다. 


    패키지에서 커서를 사용할 때 주의점은, LOOP나 WHILE문을 사용시 열기 - 패치 - 닫기 과정을 직접 명시해 줘야 하는데 만약 닫기 과정을 생략하면 같은 세션에서 재사용이 불가하다. 




    기타 특징




    PRAGMA SERIALLY_REUSABLE 옵션 : 패키지 선언부와 본문에 명시하면, 해당 패키지 데이터는 호출이 끝나면 다시 초기화 된다. 같은 세션에있더라도 값을 공유하지 않음. 굳이 세션별로 데이터 값을 공유할 필요가 없는 경우에 사용하거나, 과다한 세션으로 패키지 데이터가 저장되는 UGA(User Global Area)의 메모리 공간 낭비를 초래할 때 사용한다.


    오버로딩 (Overloading) : 동일한 이름이지만 매개변수 타입이나 개수가 다르면 함수를 여러 개 정의해 만들어 사용할 수 있는 특징. 함수와 프로시저 모두 오버로딩이 가능하다.

Designed by Tistory.