Package(패키지)

◆ 패키지(package)는 오라클 데이터베이스에 저장되어 있는 서로 관련있는 PL/SQL
프로지져와 함수들의 집합 입니다
◆ 패키지는 선언부와 본문 두 부분으로 나누어 집니다.


패키지 선언부

- 선언절은 패키지에 포함될 PL/SQL 프로시저나, 함수, 커서, 변수, 예외절을 선언 합니다.
- 패키지 선언부에서 선언한 모든 요소들은 패키지 전체에 적용됩니다.
- 즉 선언부에서 선언한 변수는 PUBLIC 변수로 사용 됩니다.



package?


패키지 본문

- 패키지 본문은 패키지에서 선언된 부분의 실행을 정의 합니다.
- 즉 실재 프로시져나 함수의 내용에 해당하는 부분이 옵니다.



package?




아주 간단한 패키지 예제입니다.

4개의 프로시저가 존재하고 있습니다.

프로시저명
프로시저 기능
보기

all_emp_info
모든 사원의 사원 정보 (사번, 성명, 입사일)
프로시저보기

all_sal_info
모든 사원의 급여 정보 (평균급여, 최고급여, 최소급여)
프로시저보기

dept_emp_info
특정 부서의 사원 정보 (사번, 성명, 입사일)
프로시저보기

dept_sql_info
특정 부서의 급여 정보 (평균급여, 최고급여, 최소급여)
프로시저보기


위 4개의 프로시저를 가지고 패키지를 생성하겠습니다.


선언부를 먼저 생성 합니다.

package 예제 (선언부)

SQL>CREATE OR REPLACE PACKAGE emp_info AS

PROCEDURE all_emp_info; -- 모든 사원의 사원 정보

PROCEDURE all_sal_info; -- 모든 사원의 급여 정보

PROCEDURE dept_emp_info (v_deptno IN NUMBER) ; -- 특정 부서의 사원 정보

PROCEDURE dept_sal_info (v_deptno IN NUMBER) ; -- 특정 부서의 급여 정보

END emp_info;

Package created.


선언부를 생성 하고 나서 본문 부분을 생성 합니다.

package 예제 (본문)

SQL>CREATE OR REPLACE PACKAGE BODY emp_info AS

-- 모든 사원의 사원 정보
PROCEDURE all_emp_info
IS

CURSOR emp_cursor IS
SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
FROM emp
ORDER BY hiredate;

BEGIN

FOR aa IN emp_cursor LOOP

DBMS_OUTPUT.PUT_LINE('사번 : ' || aa.empno);
DBMS_OUTPUT.PUT_LINE('성명 : ' || aa.ename);
DBMS_OUTPUT.PUT_LINE('입사일 : ' || aa.hiredate);

END LOOP;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');

END all_emp_info;



-- 모든 사원의 급여 정보
PROCEDURE all_sal_info
IS

CURSOR emp_cursor IS
SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
FROM emp;

BEGIN

FOR aa IN emp_cursor LOOP

DBMS_OUTPUT.PUT_LINE('전체급여평균 : ' || aa.avg_sal);
DBMS_OUTPUT.PUT_LINE('최대급여금액 : ' || aa.max_sal);
DBMS_OUTPUT.PUT_LINE('최소급여금액 : ' || aa.min_sal);

END LOOP;


EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');
END all_sal_info;



--특정 부서의 사원 정보
PROCEDURE dept_emp_info (v_deptno IN NUMBER)
IS

CURSOR emp_cursor IS
SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
FROM emp
WHERE deptno = v_deptno
ORDER BY hiredate;

BEGIN

FOR aa IN emp_cursor LOOP

DBMS_OUTPUT.PUT_LINE('사번 : ' || aa.empno);
DBMS_OUTPUT.PUT_LINE('성명 : ' || aa.ename);
DBMS_OUTPUT.PUT_LINE('입사일 : ' || aa.hiredate);

END LOOP;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');

END dept_emp_info;


--특정 부서의 급여 정보
PROCEDURE dept_sal_info (v_deptno IN NUMBER)
IS

CURSOR emp_cursor IS
SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
FROM emp
WHERE deptno = v_deptno;


BEGIN

FOR aa IN emp_cursor LOOP

DBMS_OUTPUT.PUT_LINE('전체급여평균 : ' || aa.avg_sal);
DBMS_OUTPUT.PUT_LINE('최대급여금액 : ' || aa.max_sal);
DBMS_OUTPUT.PUT_LINE('최소급여금액 : ' || aa.min_sal);

END LOOP;


EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');

END dept_sal_info;

END emp_info;
/

Package body created.




패키지의 실행

패키지의 실행은 패키지 명 다음에 .을 찍고 프로시저냐 함수 명을 써 줍니다.


먼저 set serveroutput on을 실행한후..
SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)


다음 명령들을 실행해 보세요..
SQL> exec emp_info.all_emp_info;

SQL> exec emp_info.all_sal_info;

SQL> exec emp_info.dept_emp_info(10);

SQL> exec emp_info.dept_sal_info(10);