[Oracle] 39.패키지


패키지



패키지의 사전적인 의미는 꾸러미입니다.

관련 있는 프로시저를 보다 효율적으로 관리하기 위해서 패키지 단위로 배포할 때 유용하게 사용됩니다.

패키지는 패키지 선언(명세부)과 패키지 몸체 선언(몸체부) 두 가지 모두를 정의해야 하고,

패키지 안에는 다양한 프로시져와 함수를 포함하고 있습니다!


다음은 패키지를 사용함으로써 얻는 장점입니다!



  • 하나의 객체에서 모든 연관된 코드를 관리



  • 하나의 객체가 모음집 역할



  • 객체를 GRANT/REVOKE의 권한으로 쉽게 관리



  • 유지보수의 편의성




패키지의 구성




--패키지 선언부
CREATE [ OR REPLACE ] PACKAGE package_name 
IS
	--변수선언및 커서 선언
	--프로시져 또는 함수 선언
	PROCEDURE procedure_name1;
	PROCEDURE procedure_name2;
END;
/

--패키지 몸체부
CREATE [ OR REPLACE ] PACKAGE BODY package_name 
IS
    --선언된 프로시져및 함수를 등록	
	PROCEDURE procedure_name1 
	IS
	....
	END;
END;
/



몸체부내에는 여러 가지의 프로시저나 함수를 정의하고 있고,

명세부에는 몸체부에 정의한 함수들을 선언해 놓습니다~!

패키지 내의 정의된 프로시저나 함수를 호출하는 방식은 다음과 같습니다.


EXECUTE 패키지명.프로시저명



패키지에 대해 예를 들자면 PL / SQL문에서 사용했던 문자열을 화면에 출력하는 다음 프로시저 기억하시나요??


 dbms_output.put_line('')



이 프로시저는 사실 dbm_output이라는 패키지 안에 정의된 프로시저입니다!

프로시저 명은 put_line 이죠!


패키지 작성




--패키지 선언부 

CREATE OR REPLACE PACKAGE package_ex
IS
    grade   VARCHAR2(10);
    PROCEDURE p_emp_del_eid(p_eid emp.employee_id%TYPE);
    FUNCTION f_emp_sal_grade(vsal IN emp.salary%TYPE) return VARCHAR2;
END;
/




--패키지 몸체부

CREATE OR REPLACE PACKAGE BODY package_ex 
IS
    
    -- 프로시저 구현
    PROCEDURE p_emp_del_eid (p_eid emp.employee_id%TYPE)
    IS
    BEGIN
        DELETE FROM emp
        WHERE
            employee_id = p_eid;

    dbms_output.put_line(p_eid || '번 사원이 삭제되었습니다');
    END;
    
    -- 함수 구현
    FUNCTION f_emp_sal_grade (vsal IN emp.salary%TYPE) 
    RETURN VARCHAR2 
    IS
    BEGIN
        IF ( vsal <= 3000 ) THEN
            grade := 'LOW';
        ELSIF ( vsal <= 5000 ) THEN
            grade := 'MIDDLE';
        ELSIF ( vsal <= 8000 ) THEN
            grade := 'HIGH';
        ELSE
            grade := 'MAX';
        END IF;
        return(grade);
    END;
END;
/




--패키지 함수 호출

SELECT package_ex.f_emp_sal_grade(1000)
FROM dual;




패키지 재컴파일과 삭제




패키지를 재컴파일을 하고 싶으면 다음과 같이합니다!


ALTER PACKAGE package_ex COMPLIE;



패키지를 삭제하려면 역시 DROP 문을 이용합니다!


DROP PACKAGE package_ex;

DROP PACKAGE BODY package_ex;