PL SQL

PL/SQL 패키지 (Package) - 2 (Spec, Body 생성 방법)

n.han 2016. 7. 7. 14:34

- 생성 방법

    1) CREATE PACKAGE

 

Package Spec에 선언된 변수는 기본적으로 NULL로 초기화된다. Spec에 있는 변수는 Body이 정의되어 있지 않아도 접근 가능하다. 아래 예제에서 공용 변수와 커서는 지속되므로, 계속 그 값이 유지된다. 다만 세션 별로 관리 되기 때문에(PGA에서) 다른 세션에서는 별도로 다른 값을 갖는다.

 

CREATE [OR REPLACE] PACKAGE package_name IS|AS

public type and variable declarations

subprogram specifications

END [package_name];

Package Spec 예제

 

CREATE OR REPLACE PACKAGE comm_pkg IS

v_std_comm NUMBER := 0.10; --initialized to 0.10

PROCEDURE reset_comm(p_new_comm NUMBER);

END comm_pkg;

/

 

--.1이 출력됨

EXECUTE DBMS_OUTPUT.PUT_LINE(COMM_PKG.V_STD_COMM);

 

2) CREATE BODY

 

         Package Body에 정의된 식별 자는 전용(private)이므로 Package Body 외부에서 볼 수 없다. 또한 모든 전용 생성자는 참조되기 전에 선언되어야 한다. 아래 예제에서 reset_comm이라는 프로시저는 validate 함수를 사용하고 있기 때문에, 먼저 validate 함수가 선언되어야 한다하지만, 공용(public) 생성자는 Spec에 선언되어 있기 때문에 순서와 상관 없이 사용 가능하다. 아래 예제에서 validate 함수 헤더가 Spec에 있다고 한다면 Body의 위치와 상관없이 사용 가능한 것이다.

 

CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS

private type and variable declarations

subprogram bodies

[BEGIN initialization statements]

END [package_name];

Package Body 예제

 

CREATE OR REPLACE PACKAGE BODY comm_pkg IS

-- 함수 작성부분. Spec에 선언되어 있지 않으므로 내부에서만 사용가능

FUNCTION validate(p_comm NUMBER) RETURN BOOLEAN IS

v_max_comm employees.commission_pct%type;

BEGIN

SELECT MAX(commission_pct) INTO v_max_comm

FROM employees;

RETURN (p_comm BETWEEN 0.0 AND v_max_comm);

END validate;

-- 프로시저 작성부분. 내부 validate 함수를 사용한 것을 볼 수 있다.

PROCEDURE reset_comm (p_new_comm NUMBER) IS

BEGIN

IF validate(p_new_comm) THEN

v_std_comm := p_new_comm; -- reset public var

ELSE RAISE_APPLICATION_ERROR(

-20210, 'Bad Commission');

END IF;

END reset_comm;

END comm_pkg;