😀 패키지(PACKAGE)


  - 패키지는 논리적 관련성이 있는 PL/SQL 변수,상수,커서,서브프로그램 등을 묶어 놓은 객체
  - 컴파일되어 저장되며 다른 프로그램에서 패키지의 항목을 참조,공유, 실행할 수 있음
  - 모듈화 기능제공
  - 프로그램 설계의 용이성 제공:선언부와 실행부를 서로 다른 프로그램으로 구성
  - 캡슐화 기능제공-정보의 은닉성이 확보


 1)패키지의 구조
  - 패키지는 선언부와 본문으로 구성됨


  1)선언부
   - 패키지의 명세(Specification)
   - 패키지에 사용할 변수,상수,커서,서브프로그램의 선언부 만으로 구성 --서브프로그램:트리거,프로시져,함수 등등
   - 자바의 interface와 유사

(사용형식)
    CREATE [OR REPLACE] PACKAGE 패키지명 IS
     변수,상수,커서 등의 선언;
     
     FUNCTION 함수명(
       매개변수 IN|OUT|INOUT 데이터타입[:=default],
               :
       매개변수 IN|OUT|INOUT 데이터타입[:=default])
       RETURN 타입명;
       
      PROCEDURE 프로시져명 
       매개변수 IN|OUT|INOUT 데이터타입[:=default],
               :
       매개변수 IN|OUT|INOUT 데이터타입[:=default])
       
   END [패키지명];

1)본문부
   - 패키지에 사용할 변수,상수,커서,서브프로그램으로 구성
   - 세부적인 구현부분 포함
   - 패키지의 본문은 패키지의 소유자만 접근하여 수정 가능

(사용형식)
    CREATE [OR REPLACE] PACKAGE BODY 패키지명 IS
     변수,상수,커서 등의 선언;
     
     FUNCTION 함수명(
       매개변수 IN|OUT|INOUT 데이터타입[:=default],
               :
       매개변수 IN|OUT|INOUT 데이터타입[:=default])
       RETURN 타입명;
     IS
     
     BEGIN
        실행부
        RETURN expr;
     END 함수명; 
       
      PROCEDURE 프로시져명(
       매개변수 IN|OUT|INOUT 데이터타입[:=default],
               :
       매개변수 IN|OUT|INOUT 데이터타입[:=default])
     IS
     
     BEGIN
     
     END 프로시져명;
       
   END [패키지명];

사용예)EMP 테이블에서 사원번호를 입력받아 사원정보(이름, 부서명, 직무코드)를 조회하는 함수,
      신입사원정보를 저장하는 프로시져, 퇴직자를 처리하는 프로시져를 포함하는 패키지를 hrd_pkg로 구성하시오.

(선언부)
    CREATE OR REPLACE PACKAGE hrd_pkg IS
    
    -- 사원번호를 입력받아 사원정보(이름, 부서명, 직무코드)를 조회하는 함수
    FUNCTION fn_getinfo_emp(
        p_eid IN EMP.EMP_ID%TYPE)
        RETURN VARCHAR2;
        
    -- 신입사원정보를 저장하는 프로시져.
    PROCEDURE new_emp_proc(

        p_pname IN EMP.EMP_NAME%TYPE,

        p_did IN EMP.DEPT_ID%TYPE);
        
        
    -- 퇴직자를 처리하는 프로시져
    PROCEDURE retire_emp_proc(
     p_pid IN EMP.EMP_ID%TYPE);
     
  END hrd_pkg;
(본문부)
    CREATE OR REPLACE PACKAGE BODY hrd_pkg IS
    
    -- 사원번호를 입력받아 사원정보(이름, 부서명, 직무코드)를 조회하는 함수
    FUNCTION fn_getinfo_emp(
        p_eid IN EMP.EMP_ID%TYPE)
        RETURN VARCHAR2
       IS
         L_ENAME EMP.EMP_NAME%TYPE;
         L_DNAME DEPARTMENTS.DEPARTMENT_NAME%TYPE;
         L_JID EMP.JOB_ID%TYPE;
         L_RES VARCHAR2(500); -- 반환할 정보 저장
       BEGIN
         SELECT A.EMP_NAME,B.DEPARTMENT_NAME,A.JOB_ID INTO L_ENAME,L_DNAME,L_JID
           FROM EMP A, DEPARTMENTS B
          WHERE A.EMP_ID=p_eid
            AND A.DEPT_ID=B.DEPARTMENT_ID; --조인
          L_RES:=p_eid||' '||L_ENAME||' '||L_DNAME||' '||L_JID;  
          RETURN L_RES;
       END fn_getinfo_emp;
        
    -- 신입사원정보를 저장하는 프로시져.
    PROCEDURE new_emp_proc(
        p_pname IN EMP.EMP_NAME%TYPE,
        p_did IN EMP.DEPT_ID%TYPE)
        IS
          L_EID EMP.EMP_ID%TYPE;
        BEGIN
          SELECT MAX(EMP_ID)+1 INTO L_EID
            FROM EMP;
            
           INSERT INTO EMP(EMP_ID,EMP_NAME,HIRE_DATE,DEPT_ID)
            VALUES(L_EID, p_pname, SYSDATE, p_did);
            
            COMMIT;
            
        END new_emp_proc;
        
        
    -- 퇴직자를 처리하는 프로시져
    PROCEDURE retire_emp_proc(
     p_pid IN EMP.EMP_ID%TYPE)
     IS
        L_NAME EMP.EMP_NAME%TYPE;
        L_HDATE DATE;
        L_JID JOBS.JOB_ID%TYPE;
        L_DID EMP.DEPT_ID%TYPE;
        L_CNT NUMBER:=0;
        L_NO_DATA EXCEPTION; 
     BEGIN
        SELECT COUNT(*) INTO L_CNT
          FROM EMP
         WHERE EMP_ID=p_pid;
         
         IF L_CNT != 0 THEN
            SELECT EMP_NAME, HIRE_DATE, JOB_ID, DEPT_ID 
            INTO L_NAME, L_HDATE, L_JID, L_DID
            FROM EMP
            WHERE EMP_ID=p_pid; 
           
           INSERT INTO RETIRE VALUES (p_pid, L_NAME, L_HDATE, L_JID, L_DID);
           
           DELETE FROM EMP WHERE EMP_ID=p_pid;
           
           
         ELSE
           RAISE L_NO_DATA;
          END IF; 
          
          COMMIT;
          
          EXCEPTION WHEN L_NO_DATA THEN
           DBMS_OUTPUT.PUT_LINE(p_pid||'사원정보가 없습니다. ');
           ROLLBACK;
           
     END retire_emp_proc;

     
  END hrd_pkg;
[실행]  
  SELECT EMP_ID AS 사원번호,
         HRD_PKG.FN_GETINFO_EMP(EMP_ID) AS 사원정보
    FROM EMP
   WHERE DEPT_ID = 60; 

[실행] 신규사원등록
  사원명 =>'홍길순', 부서코드=>100
  EXECUTE hrd_pkg.new_emp_proc('홍길순',100);
  
[실행] 퇴직자처리
  사원번호 => 145  
  EXECUTE hrd_pkg.retire_emp_proc(145);

'ORACLE 복습 & 정리' 카테고리의 다른 글

[ORACLE] 패키지 221202-03  (0) 2022.12.02
[ORACLE] 트리거 221202-02  (0) 2022.12.02
[ORACLE] 함수 221202-01  (0) 2022.12.02
[ORACLE] 저장프로시져 221201-04  (1) 2022.12.01
[ORACLE] 반복문 221201-03  (0) 2022.12.01

+ Recent posts