ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle(2022.03.10)-Package
    데이터베이스 2022. 3. 10. 19:15
    728x90

    Package
      - 패키지는 논리적 연관성이 있는 PL/SQL 변수, 상수커서, 서브프로그램 등의 항목을 묶어 놓은 개체 
      - 2개의 부분(선언부와 본문부)으로 별도로 구성되며, 각각 별도로 컴파일되어 서버에 저장됨 
      - 모듈화, 설계의 용이성, 캡슐화 기능 제공
      
    1. 선언부 -HR계정에서 실행하세요
      . 변수, 상수커서, 서브프로그램 등의 골격을 선언해놓은 부분(PROTOTYPE)
        -- 선언부는 자바의 추상클래스나 인터페이스 역할
      (사용형식)

     CREATE [OR REPLACE] PACKAGE 패키지명 IS
        상수명 CONSTANT 상수타입;
        변수명 데이터타입;
        커서 선언문;
        FUNCTION 함수명[(
          매개변수list)]
          RETURN 타입명;
             :
        PROCEDURE 프로시저명[(
          매개변수list)]
             :
      END 패키지명;

    사용예) 사원번호를 입력받아 이름을 출력하는 함수와, 신입사원을 사원테이블에 등록하는
           프로시져와, 퇴직자처리를 수행하는 프로시져를 하나의 패키지로 구성하시오.

     

     CREATE OR REPLACE PACKAGE HR_UPDATE_PKG IS
            FUNCTION FN_RETURN_NAME(
              P_EID IN EMPLOYEES.EMPLOYEE_ID%TYPE)  --사원번호 입력받아서 
              RETURN VARCHAR2; --사원이름을 반환
              
            PROCEDURE PROC_REGISTER_EMP(
              P_ENAME IN EMPLOYEES.EMP_NAME%TYPE,
              P_HDATE IN DATE,
              P_JID   IN JOBS.JOB_ID%TYPE,
              P_DID    IN HR.DEPARTMENTS.DEPARTMENT_ID%TYPE,
              P_SAL IN NUMBER);
            
            PROCEDURE PROC_RETIRE(
              P_EID   IN EMPLOYEES.EMPLOYEE_ID%TYPE);
           END  HR_UPDATE_PKG;

     

    2.본문부
     .선언부에서 선언된 함수나 프로시져의 구체적인 행위를 구현하는 부분
      (사용형식)

    CREATE [OR REPLACE] PACKAGE BODY 패키지명 IS
        변수/상수/커서 선언;
        
       FUNCTION 함수명(매개변수list)
          RETURN 반환타입
        IS
          선언부;
        BEGIN
          실행부;
        END 함수명;
              :
       PROCEDURE 프로시저명(매개변수list)
        IS
          선언부;
        BEGIN
          실행부;
        END 프로시저명;
      END 패키지명;

    .'패키지명': 선언부에서 선언된 패키지명과 동일 패키지명
    .'함수명'과 '프로시저명'도 선언부에서 선언된 이름과 같은 이름 사용

     

    사용예)사원번호를 입력받아 이름을 출력하는 함수와, 신입사원을 사원테이블에 등록하는
          프로시져와, 퇴직자처리를 수행하는 프로시져를 포함하는 패키지의 본문 구성하시오.

     CREATE OR REPLACE PACKAGE BODY HR_UPDATE_PKG IS
        --전역변수 전체 이패키지안에 사용될 것들(지금은 필요x)
        FUNCTION FN_RETURN_NAME( --사원번호를 입력받아 이름을 출력하는 함수
          P_EID IN EMPLOYEES.EMPLOYEE_ID%TYPE)
          RETURN VARCHAR2
          IS
            V_ENAME HR.EMPLOYEES.EMP_NAME%TYPE;
          BEGIN
            SELECT EMP_NAME INTO V_ENAME
              FROM EMPLOYEES
             WHERE EMPLOYEE_ID=P_EID;
            RETURN V_ENAME; 
          END FN_RETURN_NAME;      
        
        PROCEDURE PROC_REGISTER_EMP(
          P_ENAME  IN EMPLOYEES.EMP_NAME%TYPE,
          P_HDATE  IN DATE,
          P_JID    IN JOBS.JOB_ID%TYPE,
          P_DID    IN HR.DEPARTMENTS.DEPARTMENT_ID%TYPE,
          P_SAL    IN NUMBER)
        IS
          V_EMP_ID HR.EMPLOYEES.EMPLOYEE_ID%TYPE;
        BEGIN
          SELECT MAX(EMPLOYEE_ID)+1 INTO V_EMP_ID
            FROM HR.EMPLOYEES;
          
          INSERT INTO EMPLOYEES(EMPLOYEE_ID, EMP_NAME, HIRE_DATE, JOB_ID,DEPARTMENT_ID, SALARY)
            VALUES(V_EMP_ID, P_ENAME, P_HDATE, P_JID,P_DID, P_SAL);
          COMMIT;
        END PROC_REGISTER_EMP;
          
        PROCEDURE PROC_RETIRE(
          P_EID IN EMPLOYEES.EMPLOYEE_ID%TYPE)
        IS
        BEGIN
          UPDATE HR.EMPLOYEES  -->TG_COPY_RETIRE(트리거)가 실행됨->RETIRES테이블에 저장될것임.
             SET RETIRE_DATE=SYSDATE
           WHERE EMPLOYEE_ID=P_EID;
          COMMIT; 
        END PROC_RETIRE;
          
      END HR_UPDATE_PKG;

     

    (실행) 
     함수 FN_RETURN_NAME을 실행

    SELECT EMPLOYEE_ID AS 사원번호,
             HR_UPDATE_PKG.FN_RETURN_NAME(EMPLOYEE_ID) AS 사원명  --패키지명.함수명. 호출
        FROM HR.EMPLOYEES
      WHERE SALARY >= 15000;

    (실행2)

     2. '홍길동'사원의 정보를 사원테이블에 저장하시오.
         사원명:'홍길동'
         부서코드: 60
         JOB_ID: 'IT_PROG'
         급여: 5500
         PROC_REGISTER_EMP 패키지 바디에서 선언된 매개변수 순서대로 
          P_ENAME ,P_HDATE ,P_JID , P_DID  ,P_SAL    

    EXECUTE HR_UPDATE_PKG.PROC_REGISTER_EMP('홍길동',TO_DATE('20220302'),'IT_PROG',60,5500);

    조영하 자료 추가

    EXECUTE HR_UPDATE_PKG.PROC_REGISTER_EMP('조영하',TO_DATE('20220312'),'IT_PROG',60,5500);

     3. 사원번호 198번 사원이 오늘날짜로 퇴직했다. 이를 처리하시오

     /*UPDATE HR.EMPLOYEES
           SET RETIRE_DATE=SYSDATE
        WHERE EMPLOYEE_ID=198;*/
        이자료가 처리되게 하는 코드는  
        EXECUTE HR_UPDATE_PKG.PROC_RETIRE(198);  --PROC_RETIRE프로시저가 실행됨

     

    RETIRES테이블에 생성됨 왜? EMPLOYEES 테이블에업데이트가 되었기 때문이다.

    EMPLOYEES 도 변경됨 오늘 날짜로

     

     

    728x90
Designed by Tistory.