관련있는 프로시저/함수(서브 프로그램)를 효율적으로 관리하기 위해 모듈화시켜 배포하기 위한 단위이다. 패키지에는 서브 프로그램뿐만 아니라 상수, 변수, 커서, 레코드, 컬렉션, 예외까지 선언해서 사용할 수 있다.
CREATE OR REPLACE PACKAGE my_package
IS
PROCEDURE getEmployee(in_id IN employees.employee_id%TYPE,
out_id OUT employees.employee_id%TYPE,
out_name OUT employees.first_name%TYPE,
out_salary OUT employees.salary%TYPE);
FUNCTION getSalary(p_no employees.employee_id%TYPE)
RETURN NUMBER;
END;
함수와 프로시저의 시그니처만 우선 위와 같이 정의해둔다.
CREATE OR REPLACE PACKAGE BODY my_package
IS
-- 프로시저 정의
PROCEDURE getEmployee(in_id IN employees.employee_id%TYPE,
out_id OUT employees.employee_id%TYPE,
out_name OUT employees.first_name%TYPE,
out_salary OUT employees.salary%TYPE)
IS
BEGIN
SELECT employee_id, first_name, salary
INTO out_id, out_name, out_salary
FROM employees
WHERE employee_id = in_id;
END;
-- 함수 정의
FUNCTION getSalary(p_no employees.employee_id%TYPE)
RETURN NUMBER
IS
v_salary employees.salary%TYPE;
BEGIN
SELECT salary
INTO v_salary
FROM employees
WHERE employee_id = p_no;
RETURN v_salary;
END;
END; -- 패키지의 END
SELECT my_package.getSalary(100) FROM dual;
DECLARE
p_id NUMBER;
p_name VARCHAR2(50);
p_salary NUMBER;
BEGIN
my_package.getEmployee(100, p_id, p_name, p_salary);
dbms_output.put_line(p_id || ' ' || p_name || ' ' || p_salary);
END;