패키지

tbPSM의 변수나 타입, 서브 프로그램 등을 그룹화하여 모아 놓은 객체인 패키지를 기술합니다.

패키지 구조

패키지(package)는 개념적으로 관련 있는 tbPSM의 변수나 타입, 서브 프로그램을 그룹화하여 모아 놓은 객체입니다. 패키지는 보통 선언부와 구현부로 구성됩니다.

  • 선언부 사용자에게 보이는 인터페이스로 공개(public)적인 성격을 띱니다. 패키지의 선언부는 다음과 같은 형식을 갖습니다.

CREATE [OR REPLACE] PACKAGE 패키지_이름
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
    [변수, 타입 선언...]     -- 공개
    [커서 선언...]
    [함수 선언...]
    [프러시저 선언...] 
END;
옵션
설명

AUTHID

패키지 수준으로 패키지 된 모듈이 수행하는 권한(privileges)을 지정

패키지 모듈에서는 독립형 모듈과 달리 AUTHID 절을 사용하여 각 단위를 개별적으로 다른 권한을 지정할 수 없습니다.

  • 구현부 선언부에서 선언한 내용을 실제로 구현하는 부분입니다. 사용자에게는 구현된 내용이 보이지 않으며, 비공개적(private)인 성격을 띱니다. 패키지 구현부는 다음과 같은 형식을 갖습니다.

CREATE [OR REPLACE] PACKAGE BODY 패키지_이름
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
    [변수, 타입 선언...]         -- 비공개
    [커서 구현...]
    [함수 구현...]
    [프러시저 구현...] 
[BEGIN
    초기화]
END;

패키지는 선언부에서 선언된 커서나 서브 프로그램 등에 대해 구현부에서 실제로 실행될 내용을 구현해야 합니다. 그렇지 않으면 예외 상황이 발생합니다.

패키지 구현부에서는 변수나, 타입, 커서, 예외 상황, 서브 프로그램 등을 선언하고 구현할 수 있는데, 선언부에 존재하지 않는 변수나 서브 프로그램 등은 사용자에게 공개되지 않기 때문에 사용할 수 없습니다.

패키지 초기화

패키지 구현부에는 BEGIN ... END 절을 사용할 수 있습니다. BEGIN ... END 절 사이에는 선언부에서 명시한 변수를 초기화할 수 있고, 패키지가 처음 사용되는 시점에 단 한번 호출됩니다.

다음은 패키지 초기화의 예제입니다.

  • anniversary_manager 패키지의 선언부

  • anniversary_manager 패키지의 구현부

다음은 anniversary_manager 패키지를 수행한 결과입니다.

위 결과에서 보듯이 첫 번째로 compute_elapsed_days 프러시저가 호출된 경우에는 패키지 구현부의BEGIN...END 절이 수행되는 반면, 두 번째로 호출된 경우에는 수행되지 않는 것을 알 수 있습니다.

패키지 객체

패키지 객체(Instance)란 패키지에 선언한(서브 프로그램을 제외한) 변수, 타입, 예외 상황, 커서 등을 말합니다.

패키지 객체 연속성

최초로 패키지가 참조되는 순간에 패키지 객체의 전부가 메모리에 로딩되고, 한번 로딩된 패키지 객체는 세션이 닫히기 전까지는 계속 존재하게 됩니다. 또한 한 명의 사용자가 서로 다른 프로그램을 호출하는 동안에도(직접 해당 변수를 수정하지 않는 조건이라면) 패키지 객체는 동일한 값을 갖습니다.

다음은 패키지 객체 연속성 예제입니다.

  • test_instance 패키지의 선언부

  • test_instance 패키지의 구현부

다음은 test_instance 패키지를 수행한 결과입니다.

ⓐ에서 total_cnt에 대입한 값이 계속 유지되고 있습니다. 이때 SQL 문장을 실행하면 다음과 같이 변경된 값의 결과가 출력됩니다.

패키지 객체 참조범위

한 패키지 객체는 한 명의 사용자에게만 한정됩니다. 따라서 서로 다른 사용자는 각각 다른 객체를 참조하게 됩니다. test_instance 패키지의 예를 기준으로 다음과 같이 SQL 문장을 실행합니다.

이러한 과정을 수행하고 나서 다른 콘솔 창을 실행하여 다시 같은 사용자로 접속합니다.

이전에 total_cnt의 값을 0에서 3으로 바꾼 것과는 상관없이 초기값 0이 그대로 유지되고 있는 것을 확인할 수 있습니다.

패키지 서브 프로그램 중복 선언

패키지의 서브 프로그램은 중복 선언을 할 수 있습니다.

다음은 패키지 서브 프로그램의 중복 선언에 대한 예입니다.

  • calculator 패키지의 선언부

  • calculator 패키지의 구현부

SERIALLY RESUABLE 패키지

SERIALLY RESUABLE 패키지는 패키지 객체(Instance)의 상태가 서버 호출 동안 유지됩니다. 사용할 때마 다 패키지 객체가 초기화되며 이전 서버 호출에서 변경한 패키지의 상태는 유지되지 않습니다.

다음은 SERIALLY RESUABLE 패키지 예제입니다.

  • sr_pkg 패키지의 선언부

  • sr_pkg 패키지의 구현부

다음은 sr_pkg 패키지를 수행한 결과입니다.

위 결과에서 보듯이 SERIALLY_REUSABLE 패키지의 경우 패키지 객체(Instance)의 상태가 서버 호출 동안만 유지됩니다.

다음은 SQL 문을 통해 sr_pkg 패키지에 접근하는 경우 예제입니다.

SERIALLY_REUSABLE 패키지를 SQL 문을 통해서 접근하려고 하면 오류가 발생합니다.

시스템 패키지

tbPSM에서는 사용자의 편의를 위해 STANDARD,DBMS_LOB, DBMS_OUTPUT, UTL_RAW 패키지등의 시스템 패키지를 제공합니다.

STANDARD 패키지는 tbPSM에서 사용하는 모든 타입과 예외 상황, 시스템 서브 프로그램을 정의합니다. 만약 사용자의 실수로 이 패키지가 삭제되거나 내용이 변경된다면 tbPSM 프로그램의 수행 자체가 실패하거나 잘못된 결과를 출력할 수 있으므로 주의해야 합니다.

STANDARD 패키지를 직접 수정하지 않고, 사용자의 편의에 따라 같은 이름의 서브 프로그램이나 패키지를 생성할 수 있는데, 이러한 경우 우선순위에 따라 항상 사용자 패키지나 서브 프로그램이 우선권을 가지게 됩니다. 따라서 STANDARD 패키지를 다시 사용하려면 STANDARD.XXX 형식으로 생성하면 됩니다.

circle-info

참고

DBMS_LOB, DBMS_OUTPUT, UTL_RAW 패키지에 대한 자세한 내용은 "Tibero tbPSM 참조 안내서"를 참고합니다.

Last updated