Package란? 

  • 오라클 데이터베이스에 저장되어 있는 서로 관련있는 PL/SQL 프로지져와 함수들의 집합
  • 사용방법

선언부 (Java에서 Interface라고 생각하면 이해하기 편함!)

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;

구현부 (Java에서 Implement 라고 이해합시당)

create or replace PACKAGE BODY emp_info AS
  -----------------------------------------------------------------
  -- 모든 사원의 사원 정보
  -----------------------------------------------------------------
  PROCEDURE all_emp_info
  IS
  CURSOR emp_cursor IS
      SELECT empno, ename, to_char(hiredate, 'YYYY/MM/DD') hiredate
      FROM   emp
      ORDER BY hiredate;
  BEGIN
      DBMS_OUTPUT.ENABLE;
      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_sal_cursor IS
        SELECT AVG(sal) avg_sal, MAX(sal) max_sal, MIN(sal) min_sal
        FROM emp;
  BEGIN
    DBMS_OUTPUT.ENABLE;
    
    FOR aa IN emp_sal_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_info IS
      SELECT empno, ename, to_char(hiredate, 'YYYY/MM/DD') hiredate
      FROM   emp
      WHERE  deptno = v_deptno;
  BEGIN
    DBMS_OUTPUT.ENABLE;
    
    FOR aa IN emp_info 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_info IS
      SELECT ROUND(AVG(sal),3) avg_sal, MAX(sal) max_sal, MIN(sal) min_sal
      FROM   emp;
  BEGIN
    DBMS_OUTPUT.ENABLE;
    
    FOR aa IN emp_info 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;

+ Recent posts