본 장에서는 패키지의 기본 개념과 구성을 소개한다.
패키지(package)는 하나 이상의 tbPSM 프러시저(procedure)와 함수(function) 등을 포함하는 스키마 객체이다. 하나의 패키지에 포함되는 스키마 객체는 프러시저와 함수를 비롯하여 변수, 커서(cursor), 예외 상황(exception) 등이 있다.
패키지는 프러시저, 함수와 마찬가지로 임의의 SQL 문장에서 사용할 수 있다.
패키지를 사용함으로써 얻을 수 있는 장점은 다음과 같다.
연관된 프러시저와 함수의 개발과 관리가 쉽다.
예를 들어 여러 프러시저와 함수에서 공통으로 액세스하는 변수를 패키지에 포함시킬 수 있다.
애플리케이션 프로그램의 개발이 쉽다.
패키지에서 지원하는 여러 기능을 이용하면 좀 더 강력한 애플리케이션 프로그램을 작성할 수 있다.
효율적인 실행이 가능하다.
권한의 부여와 회수, 메모리 로딩(memory loading) 등이 패키지 단위로 수행되기 때문에 효율적인 실행이 가능하다.
패키지는 사용자 정의 패키지와 Tibero에서 제공하는 시스템 패키지로 구성된다.
사용자 정의 패키지는 사용자가 원하는 목적에 맞춰 정의하는 패키지이다.
사용자 정의 패키지는 프러시저, 함수와 유사하게 다음과 같이 정의할 수 있다.
외부 인터페이스이며 공개 프러시저(public procedure)와 함수, 변수, 상수 등을 포함한다.
패키지 선언부의 세부 내용은 다음과 같다.
문법
CREATE [OR REPLACE] PACKAGE package_name [invoker_rights] AS -- 공개 프러시저의 선언 -- 공개 함수의 선언 -- 공개 변수, 상수, 예외 상황의 선언 END [package_name];
특징
CREATE PACKAGE 문장을 이용하여 선언부를 생성한다.
패키지 이름(package_name) 다음에 패키지를 호출자 권한(invoker's rights) 또는 정의자 권한(definer's rights)으로 실행할 것인지를 설정할 수 있다. 설정이 생략되면 정의자 권한으로 실행된다.
END 다음에 패키지 이름은 생략해도 상관없다.
사용 예제
[예 1.1] EMP_MGMT 패키지의 선언부
CREATE PACKAGE EMP_MGMT AS ... EMP_MGMT 패키지의 선언부 ...
FUNCTION HIRE(ENAME VARCHAR, ADDR VARCHAR, SALARY NUMBER,
DEPTNO INT) RETURN INT;
PROCEDURE FIRE(EMPNO INT);
PROCEDURE RAISE_SALARY(EMPNO INT, AMOUNT NUMBER);
EMP_NOT_FOUND EXCEPTION;
END EMP_MGMT;
위의 예에서는 EMP_MGMT 패키지를 정의자 권한으로 실행하며, 공개 프러시저(2개)와 함수(1개) 그리고 공개 예외 상황(1개)를 포함하고 있다.
실제 프로그램이 구현되는 부분이다. 공개 프러시저와 함수 등의 프로그램 구현부와 함께 비공개 프러시저(private procedure)와 함수, 변수 등을 포함한다.
패키지 구현부의 세부 내용은 다음과 같다.
문법
CREATE [OR REPLACE] PACKAGE BODY package_name AS -- 공개 프러시저의 구현부 -- 공개 함수의 구현부 -- 비공개 프러시저 및 함수의 선언부 -- 비공개 프러시저 및 함수의 구현부 -- 비공개 변수, 상수, 예외 상황의 정의 [BEGIN -- 초기화 명령어의 집합부 END [package_name];
특징
CREATE PACKAGE BODY 문장을 이용하여 구현부를 생성한다.
END 다음에 패키지 이름은 생략해도 상관없다.
사용 예제
[예 1.2] EMP_MGMT 패키지의 구현부
CREATE PACKAGE BODY EMP_MGMT AS ... EMP_MGMT 패키지의 구현부 ... NUM_EMP INT; EMPNO NUMBER := 0; FUNCTION HIRE(ENAME VARCHAR, ADDR VARCHAR, SALARY NUMBER, DEPTNO INT) RETURN INT AS BEGIN EMPNO := EMPNO + 1; ... 새로운 EMPNO 생성 ... INSERT INTO EMP VALUES (EMPNO, ENAME, ADDR, SALARY, DEPTNO); NUM_EMP := NUM_EMP + 1; RETURN(EMPNO); END; PROCEDURE FIRE(EMPNO INT) AS BEGIN DELETE FROM EMP WHERE EMP.EMPNO = FIRE.EMPNO; NUM_EMP := NUM_EMP ? 1; END; PROCEDURE RAISE_SALARY(EMPNO INT, AMOUNT NUMBER) AS BEGIN UPDATE EMP SET SALARY = SALARY + AMOUNT WHERE EMP.EMPNO = RAISE_SALARY.EMPNO; END; END EMP_MGMT;
위의 예에서는 [예 1.1]에 포함된 모든 프러시저와 함수에 대한 정의를 포함하고 있으며, 비공개 변수인 NUM_EMP를 선언하고 있다.
패키지 프러시저와 함수를 정의하는 방법은 패키지 변수, 상수, 예외 상황에 대한 내용 외에는 일반 프러시저 및 함수를 정의하는 방법과 동일하다.
프러시저 또는 함수 내부의 컬럼의 이름과 변수의 이름이 같은 경우 컬럼이 포함된 테이블의 이름이나 프러시저 또는 함수의 이름을 지정하여 혼동을 피할 수 있다. 예를 들어 프러시저 FIRE 함수의 내부에서 테이블 EMP에 포함된 컬럼 EMPNO와 프러시저 FIRE로 전달된 파라미터 변수 EMPNO가 같은 이름을 가지므로, 각각 테이블 이름과 프러시저 이름을 지정해 주었다.
패키지 내에 포함된 프러시저나 함수를 그 패키지의 소유자 이외의 다른 사용자가 호출하도록 할 수 있다. 프러시저나 함수를 호출하려면 해당 패키지의 EXECUTE 권한을 부여 받아야 한다. 해당 패키지의 소유자는 항상 해당 패키지를 호출할 수 있다.
뷰(view)가 패키지 프러시저나 함수를 이용하여 정의된 경우에는 뷰를 접근하기 위해 SELECT 권한을 부여 받아야 한다. 이때 해당 패키지의 EXECUTE 권한은 필요하지 않다. 패키지 프러시저나 함수를 참조하려면 패키지의 이름과 프러시저 또는 함수의 이름을 함께 써주어야 한다.
다음은 [예 1.1]에서 정의한 EMP_MGMT 패키지 내의 HIRE 함수를 호출하는 예이다. 이때 반환값은 EMPNO 변수에 저장된다.
DECLARE empno NUMBER; BEGIN empno := EMP_MGMT.HIRE('John', 'New York', 45000, 5); DBMS_OUTPUT.PUT_LINE('Hired employee No. is ' || empno); END;
시스템 패키지는 Tibero에서 기본적으로 제공하는 패키지 라이브러리로, SYS 사용자의 소유로 정의된다. 또한 Tibero를 설치한 후에 일반 사용자도 사용할 수 있도록 시스템 패키지와 동일한 이름의 공용 동의어(Public Synonym)가 정의된다. 그리고 일반 사용자가 시스템 패키지의 프러시저 또는 함수를 호출하면 호출자 권한으로 실행된다.
시스템 패키지는 일반 사용자에게 여러 가지의 확장된 기능을 제공한다. 시스템 패키지를 SQL 문장에서 그대로 사용한다거나, 다른 프러시저와 함수 그리고 패키지를 정의할 때도 사용할 수 있다.
시스템 패키지의 프러시저와 함수를 호출하는 방법은 사용자 정의 패키지와 같다.
다음은 32KB 이상인 대용량 객체의 이름과 생성자를 출력하는 예이다.
SELECT name, creator FROM image WHERE DBMS_LOB.GETLENGTH(data) >= 32768;
위 예에서 보듯이 data는 image 테이블에서 대용량 객체형으로 정의된 컬럼이다.
시스템 패키지 | 설명 |
---|---|
DBMS_APM | Automatic Performance Monitoring(이하 APM) 기능을 사용하는데 필요로 하는 기능을 제공하기 위한 패키지이다. |
DBMS_APPLICATION_INFO | 애플리케이션 정보에 관련된 뷰의 값을 변경하기 위한 패키지이다. |
DBMS_CRYPTO | DES, DES3, AES 알고리즘 및 체인, 패딩 기법을 이용한 확장된 데이터 암호화 및 복호화 패키지이다. |
DBMS_DEBUG | 개의 세션을 이용하여 PSM 프로그램의 디버깅을 할 수 있는 패키지이다. |
DBMS_ERRLOG | DML의 error logging 기능을 지원하는 패키지이다. |
DBMS_FLASHBACK | Flashback 기능을 지원하는 패키지이다. |
DBMS_JAVA | 데이터베이스에서 사용하는 Java 객체에 접근하기 위한 패키지이다. |
DBMS_JOB | JOB을 관리하기 위한 패키지이다. |
DBMS_JOB_WITH_NAME | JOB을 name을 통해 관리하기 위한 패키지이다. |
DBMS_LOB | BLOB, CLOB 타입의 대용량 데이터를 처리하기 위한 패키지이다. |
DBMS_LOCK | 세션을 대기시키는 패키지이다. |
DBMS_METADATA | DB Object에 metadata 정보를 조회하여 생성 script를 얻을 수 있는 함수이다. |
DBMS_MONITOR | 인스턴스 단위, 세션 단위, 클라이언트 식별자 단위로 SQL 수행을 모니터링하기 위한 패키지이다. |
DBMS_MVIEW | 실체화 뷰(Materialized View)와 관련된 정보를 제공하고 이 정보를 최근의 것으로 변경할 수 있는 REFRESH 기능을 사용하기 위한 패키지이다. |
DBMS_OBFUSCATION_TOOLKIT | DES, DES3 알고리즘을 이용한 데이터 암호화 및 복호화 패키지이다. |
DBMS_OUTPUT | 메시지 버퍼에 메시지를 저장하고 읽기 위한 패키지이다. |
DBMS_RANDOM | 임의의 숫자 및 문자열을 생성하는 패키지이다. |
DBMS_REDEFINITION | 온라인 상태(on-line state)에서 특정 테이블을 재정의하기 위한 패키지이다. |
DBMS_REDEFINITION_STATS | 테이블을 재정의에 대한 통계정보를 보기 위한 패키지이다. |
DBMS_REPAIR | 테이블과 인덱스 내의 깨진 블록을 검사하고 복구하는 기능을 제공하는 패키지이다. |
DBMS_RESULT_CACHE | Result Cache를 관리하는 패키지이다. |
DBMS_ROWID | ROWID에 담긴 정보를 보거나 생성하기 위한 패키지이다. |
DBMS_SESSION | 세션 식별자를 관리하는 패키지이다. |
DBMS_SPACE | 세그먼트(segment)의 크기와 공간 사용에 대한 정보를 제공하는 패키지이다. |
DBMS_SPACE_ADMIN | 세그먼트를 관리하는 기능을 제공하는 패키지이다. |
DBMS_SQL | 데이터베이스에 접근하는 Dynamic SQL을 사용하기 위한 패키지이다. |
DBMS_STATS | 데이터베이스 객체에 대한 통계 정보를 관리하기 위한 패키지이다. |
DBMS_SYSTEM | SYS 권한을 가진 관리자가 시스템적인 제어를 위해 사용하는 패키지이다. |
DBMS_TRANSACTION | 트랜잭션(transaction) 문장을 실행하고 트랜잭션을 관리하기 위한 패키지이다. |
DBMS_TYPES | Tibero에서 사용되는 데이터 타입들을 숫자로 정의한 패키지이다. |
DBMS_UTILITY | 여러 가지 유용한 기능들을 제공하는 패키지이다. |
DBMS_VERIFY | 플랜 정보와 플랜의 수행 정보들에 대해 사용자가 원하는 항목을 선택해서 다양한 포맷으로 출력할 수 있는 기능을제공한다. |
DBMS_XMLGEN | 쿼리를 입력으로 받고 해당 쿼리의 결과 집합을 XMLTYPE으로 생성해주는 패키지이다. |
DBMS_XPLAN | 플랜 정보와 플랜의 수행 정보들에 대해 사용자가 원하는 항목을 선택해서 다양한 포맷으로 출력할 수 있는 기능을 제공한다. |
HTP | HTML 소스코드를 생성하는 패키지이다. Apache 웹 서버 모듈로 개발된 mod_tbpsm과 연동되어 프러시저를 호출할 때 HTML 페이지를 생성하여 내보낸다. |
TEXT_DDL | TEXT INDEX를 사용할 때 TEXT INDEX의 설정들을 변경하기 위한 패키지이다. |
UTL_ENCODE | 호스트 간의 데이터를 전송할 수 있도록 표준 인코딩 기술로 인코딩하기 위한 패키지이다. |
UTL_FILE | 운영체제에서 관리하는 파일에 접근하기 위한 패키지이다. |
UTL_HTTP | 웹 표준(RFC2616)에 따라 웹 페이지(Web page)의 요청을 처리하기 위한 패키지이다. |
UTL_I18N | 언어, 국가별 설정들 간의 호환 기능을 제공하는 패키지이다. |
UTL_MATCH | 문자열의 유사도를 계산하는 함수들을 제공하는 패키지이다. |
UTL_RAW | RAW 타입의 데이터를 처리하기 위한 패키지이다. |
UTL_TCP | tbPSM을 이용한 원격 TCP 서버와의 TCP/IP 소켓 통신을 지원하는 패키지이다. |
UTL_URL | URL(Uniform Resource Locator) 주소를 ESCAPE 형태로 변환하기 위한 패키지이다. |
위의 패키지에 대한 자세한 내용은 해당 패키지를 설명하는 각 장을 참고한다.