PL/SQL 패키지: 이해와 활용 방법
패키지(package)는 PL/SQL 서브 프로그램을 하나의 논리 그룹으로 묶어 통합, 관리하는 객체입니다. 이는 업무나 기능 면에서 연관성이 높은 프로시저, 함수 등의 여러 PL/SQL 서브 프로그램을 포함합니다. 패키지를 사용하면 서브 프로그램을 그룹화하여 관리할 수 있으며, 이는 프로그램의 사용성과 성능을 크게 향상시킵니다. 이번 포스팅에서는 패키지의 구조와 생성, 장점, 사용 방법 등에 대해 알아보겠습니다.
패키지의 장점
1. 모듈성
패키지는 서브 프로그램을 포함한 여러 PL/SQL 구성 요소를 모듈화하여 프로그램의 이해를 쉽게 하고, 패키지 사이의 상호 작용을 간편하고 명료하게 해줍니다.
2. 쉬운 응용 프로그램 설계
패키지에 포함할 서브 프로그램은 완벽하게 완성되지 않아도 정의가 가능하므로, 전체 소스 코드를 다 작성하기 전에 미리 패키지에 저장할 서브 프로그램을 지정할 수 있습니다.
3. 정보 은닉
패키지에 포함된 서브 프로그램의 외부 노출 여부를 지정할 수 있어, 보안을 강화할 수 있습니다.
4. 기능성 향상
패키지 내부에서는 서브 프로그램 외에도 변수, 커서, 예외 등을 공용으로 사용할 수 있습니다.
5. 성능 향상
패키지에 포함된 모든 서브 프로그램이 메모리에 한 번에 로딩되며, 메모리에 로딩된 후의 호출은 디스크 I/O를 일으키지 않으므로 성능이 향상됩니다.
패키지 구조와 생성
패키지는 보통 두 부분으로 나누어 제작합니다: 명세(specification)와 본문(body).
패키지 명세
패키지 명세는 변수, 상수, 예외, 커서, 그리고 서브 프로그램을 선언하는 용도로 작성합니다. 패키지 명세 기본 형식은 다음과 같습니다:
CREATE [OR REPLACE] PACKAGE 패키지 이름
IS | AS
서브프로그램을 포함한 다양한 객체 선언
END [패키지 이름];
예를 들어, 다음은 변수 한 개, 함수 한 개, 프로시저 두 개를 선언하는 패키지 명세입니다:
CREATE OR REPLACE PACKAGE pkg_example
IS
spec_no NUMBER := 10;
FUNCTION func_aftertax(sal NUMBER) RETURN NUMBER;
PROCEDURE pro_emp(in_empno IN EMP.EMPNO%TYPE);
PROCEDURE pro_dept(in_deptno IN DEPT.DEPTNO%TYPE);
END;
/
패키지 본문
패키지 본문에는 패키지 명세에서 선언한 서브 프로그램 코드를 작성합니다. 패키지 본문 기본 형식은 다음과 같습니다:
CREATE [OR REPLACE] PACKAGE BODY 패키지 이름
IS | AS
패키지 명세에서 선언한 서브 프로그램을 포함한 여러 객체를 정의
END [패키지 이름];
다음은 패키지 본문 예시입니다:
CREATE OR REPLACE PACKAGE BODY pkg_example
IS
body_no NUMBER := 10;
FUNCTION func_aftertax(sal NUMBER) RETURN NUMBER
IS
tax NUMBER := 0.05;
BEGIN
RETURN (ROUND(sal - (sal * tax)));
END func_aftertax;
PROCEDURE pro_emp(in_empno IN EMP.EMPNO%TYPE)
IS
out_ename EMP.ENAME%TYPE;
out_sal EMP.SAL%TYPE;
BEGIN
SELECT ENAME, SAL INTO out_ename, out_sal
FROM EMP
WHERE EMPNO = in_empno;
DBMS_OUTPUT.PUT_LINE('ENAME : ' || out_ename);
DBMS_OUTPUT.PUT_LINE('SAL : ' || out_sal);
END pro_emp;
PROCEDURE pro_dept(in_deptno IN DEPT.DEPTNO%TYPE)
IS
out_dname DEPT.DNAME%TYPE;
out_loc DEPT.LOC%TYPE;
BEGIN
SELECT DNAME, LOC INTO out_dname, out_loc
FROM DEPT
WHERE DEPTNO = in_deptno;
DBMS_OUTPUT.PUT_LINE('DNAME : ' || out_dname);
DBMS_OUTPUT.PUT_LINE('LOC : ' || out_loc);
END pro_dept;
END;
/
서브프로그램 오버로드
서브프로그램 오버로드는 같은 패키지에서 사용하는 파라미터의 개수, 자료형, 순서가 다를 경우에 한해서만 이름이 같은 서브 프로그램을 정의하는 것입니다. 예를 들어, 다음과 같이 프로시저를 오버로드할 수 있습니다:
CREATE OR REPLACE PACKAGE pkg_overload
IS
PROCEDURE pro_emp(in_empno IN EMP.EMPNO%TYPE);
PROCEDURE pro_emp(in_ename IN EMP.ENAME%TYPE);
END;
/
패키지 본문에서 오버로드된 프로시저를 작성하는 예시는 다음과 같습니다:
CREATE OR REPLACE PACKAGE BODY pkg_overload
IS
PROCEDURE pro_emp(in_empno IN EMP.EMPNO%TYPE)
IS
out_ename EMP.ENAME%TYPE;
out_sal EMP.SAL%TYPE;
BEGIN
SELECT ENAME, SAL INTO out_ename, out_sal
FROM EMP
WHERE EMPNO = in_empno;
DBMS_OUTPUT.PUT_LINE('ENAME : ' || out_ename);
DBMS_OUTPUT.PUT_LINE('SAL : ' || out_sal);
END pro_emp;
PROCEDURE pro_emp(in_ename IN EMP.ENAME%TYPE)
IS
out_ename EMP.ENAME%TYPE;
out_sal EMP.SAL%TYPE;
BEGIN
SELECT ENAME, SAL INTO out_ename, out_sal
FROM EMP
WHERE ENAME = in_ename;
DBMS_OUTPUT.PUT_LINE('ENAME : ' || out_ename);
DBMS_OUTPUT.PUT_LINE('SAL : ' || out_sal);
END pro_emp;
END;
/
패키지 사용하기
패키지에 포함된 서브 프로그램을 실행하려면 다음과 같이 사용할 수 있습니다:
BEGIN
DBMS_OUTPUT.PUT_LINE('--pkg_example.func_aftertax(3000)--');
DBMS_OUTPUT.PUT_LINE('after-tax:' || pkg_example.func_aftertax(3000));
DBMS_OUTPUT.PUT_LINE('--pkg_example.pro_emp(7788)--');
pkg_example.pro_emp(7788);
DBMS_OUTPUT.PUT_LINE('--pkg_example.pro_dept(10)--' );
pkg_example.pro_dept(10);
DBMS_OUTPUT.PUT_LINE('--pkg_overload.pro_emp(778
'Be Smart > SQL' 카테고리의 다른 글
[Oracle] 오라클 DB에서 삭제한 데이터 복구 방법 (0) | 2024.07.09 |
---|---|
[오라클] 오라클 트리거란? DML 트리거의 사용법과 관리 방법 (0) | 2024.07.04 |
[Oracle] 오라클 함수와 프로시저의 차이점 및 함수 생성과 사용 방법 (0) | 2024.07.02 |
[오라클] 저장 프로시저(Stored Procedure) 사용 가이드 (0) | 2024.07.01 |
[오라클] PL/SQL 저장 서브 프로그램: 효율적인 데이터베이스 관리의 핵심 (0) | 2024.07.01 |
댓글