C#,Delphi,Oracle,MSSQL 개발자블로그
[Oracle/PLSQL]5.패키지 작성 본문
● 패키지
- 논리적으로 관련된 PL/SQL 유형, 항목 및 서브 프로그램을 하나의 컨테이너로 묶는다.
Ex. HR 패키지에는 채용 및 해고 프로시저, 커시면 및 보너스 함수, 비과세 변수 등이 들어있을 수 있다.
- 명세(Specification), 몸체(Body)의 두 부분으로 구성된다.
- 호출 또는 중첩하거나 매개변수를 지급할 수 없다.
- 패키지 PL/SQL 생성자를 호출하면 전체 패키지가 메모리에 로드되므로 나중에 관련 생성자를 호출할 때 디스크 I/O가 필요하지 않다.
- 패키지 명세는 패키지 몸체 없이 존재할 수 있지만, 패키지 몸체는 패키지 명세 없이 존재할 수 없다.
- 패키지에 통합한 독립형 프로시저는 삭제해야 한다.
● 패키지 명세 작성
CREATE [OR REPLACE] PACKAGE package_name
IS/AS
public type and item declarations
subprogram specifications
END package_name;
매개변수 |
설명 |
package_name |
패키지 이름이다. |
public type and item declarations |
변수, 상수, 커서, 예외 사항 또는 유형을 선언한다. |
subprogram specifications |
PL/SQL 하위 프로그램을 선언한다. |
Ex.
CREATE OR REPLACE PACKAGE comm_package
IS
PROCEDURE reset_comm
(v_comm IN NUMBER);
END comm_package;
● 패키지 몸체 작성
CREATE [OR REPLACE] PACKAGE BODY package_name
IS/AS
private type and item declarations
subprogram bodies
END package_name;
Ex.
CREATE OR REPLACE PACKAGE BODY comm_package
--전역변수 선언 부
IS
FUNCTION validate_comm (v_comm IN NUMBER)
RETURN BOOLEAN
IS
v_max_comm NUMBER;
BEGIN
SELECT MAX (comm) INTO v_max_comm FROM emp;
IF v_comm > v_max_comm
THEN
RETURN (FALSE);
ELSE
RETURN (TRUE);
END IF;
END validate_comm;
PROCEDURE reset_comm (v_comm IN NUMBER)
IS
l_comm NUMBER := 10;
BEGIN
IF validate_comm (v_comm)
THEN
l_comm := v_comm;
ELSE
RAISE_APPLICATION_ERROR (-20210, 'Invalid commission');
END IF;
END reset_comm;
END comm_package;
패키지 공용 프로시저 실행.
EXECUTE package_name.procedure_name(parameters)
EXECUTE comm_package.reset_comm(15)
● 전역(공용)변수
패키지 몸체가 필요 없는 패키지 명세도 작성할 수 있다.
CREATE OR REPLACE PACKAGE global_vars
IS
mile_2_kilo CONSTANT NUMBER := 1.6093;
kilo_2_mile CONSTANT NUMBER := 0.6214;
yard_2_meter CONSTANT NUMBER := 0.9144;
meter_2_yard CONSTANT NUMBER := 1.0936;
END global_vars;
실행확인.
EXECUTE DBMS_OUTPUT.PUT_LINE('20 miles =' || 20 * global_vars.mile_2_kilo || ' km')
● 패키지 생성자 호출
1. 동일한 패키지의 프로시저에서 함수를 호출
☞ 위의 [● 패키지 몸치 작성] 에서 사용한 패키지 예시로 작성하였다.
CREATE OR REPLACE PACKAGE comm_package IS
...
PROCEDURE reset_comm
(v_comm IN NUMBER)
IS
l_comm NUMBER := 10;
BEGIN
IF validate_comm(v_comm)
THEN l_comm := v_comm;
ELSE
RAISE_APPLICATION_ERROR
(-20210, 'Invalid commission');
END IF;
END reset_comm;
END comm_package;
RESET_COMM 프로시저에서 VALIDATE_COMM 함수를 호출한다. 두 서브 프로그램 모두 COMM_PACKAGE 패키지에 있다.
2. SQL*PLUS, SQL*DBA 에서 호출
EXECUTE comm_package.reset_comm(15)
3. 다른 스키마에 있는 패키지 프로시저를 호출
EXECUTE scott.comm_package.reset_comm(15)
4. 원격 데이터베이스에 있는 패키지 프로시저를 호출
EXECUTE comm_package.reset_comm@ny(15)
ny라는 데이터베이스 링크로 연결되는 원격 데이터베이스의 RESET_COMM프로시저를 호출한다.
● 독립형 프로시저에서 공용 변수 참조
다른 패키지의 변수를 가져와서 사용할 수 있다.
CREATE PROCEDURE meter_to_yard
(v_meter IN NUMBER,
v_yard OUT NUMBER)
IS
BEGIN
v_yard := v_meter * global_vars.meter_2_yard;
END meter_to_yard;
실행확인.
VARIABLE yard NUMBER
EXECUTE meter_to_yard (1, :yard)
PRINT yard
● 패키지 제거
- 패키지 명세 및 몸체 제거
DROP PACKAGE package_name
- 패키지 몸체 제거
DROP PACKAGE BODY package_name
'Programming > Oracle 공부' 카테고리의 다른 글
[Oracle/PLSQL]7.Oracle지원 패키지 (0) | 2017.06.23 |
---|---|
[Oracle/PLSQL]6.패키지 개념 추가 정보 (0) | 2017.06.23 |
[Oracle/PLSQL]4.함수 작성 (0) | 2017.06.07 |
[Oracle/PLSQL]3.프로시저 작성 (0) | 2017.06.07 |
[Oracle/PLSQL]1.PL/SQL 개요 (0) | 2017.06.07 |