-- 패키지 선언

CREATE OR REPLACE PACKAGE pEmp IS
    FUNCTION fnTax( p IN NUMBER ) RETURN NUMBER;
    PROCEDURE empList(pName VARCHAR2);
    PROCEDURE empList;   -- 중복 정의 (패키지 안에서는 가능)
END pEmp;
/

앞으로 만들 FUNCTION과 PROCEDURE을 선언할 수 있습니다.

 

-- 패키지 몸체 구현

CREATE OR REPLACE PACKAGE BODY pEmp IS
    -- 함수 구현
    FUNCTION fnTax( p IN NUMBER ) 
    RETURN NUMBER
    IS
        t NUMBER := 0;
    BEGIN
        IF p >= 3000000 THEN
            t := TRUNC(p * 0.03, -1);
        ELSIF p >= 2000000 THEN
            t := TRUNC(p * 0.02, -1);
        ELSE
            t := 0;
        END IF;
        
        RETURN t;
    END;
    
    PROCEDURE empList( pName VARCHAR2 )
    IS
        vName VARCHAR2(30);
        vSal NUMBER;
        CURSOR cur_emp IS
            SELECT name, sal FROM emp WHERE INSTR( name, pName) = 1;
        BEGIN
            OPEN cur_emp;
            LOOP
                FETCH cur_emp INTO vName, vSal;
                EXIT WHEN cur_emp%NOTFOUND;
                DBMS_OUTPUT.PUT_LINE(vName|| ' : ' || vSal);
            END LOOP;
            CLOSE cur_emp;
        END;
        
        PROCEDURE empList
        IS
        BEGIN
            FOR rec IN ( SELECT name, sal+bonus pay, fnTax(sal+bonus) tax FROM emp ) LOOP
                DBMS_OUTPUT.PUT_LINE( rec.name || ' : ' || rec.pay || ' : ' || rec.tax);
            END LOOP;
        END;
END pEmp;
/

 

-- 패키지 확인

SELECT * FROM user_objects;
SELECT * FROM user_objects WHERE object_type = 'PACKAGE';
SELECT * FROM user_procedures;

 

-- 실행

EXEC pEmp.empList;
EXEC pEmp.empList('김');

-- 패키지에 있는 함수를 SELECT 문에서도 사용할 수 있다.

SELECT name, sal, bonus, sal+bonus, pEmp.fnTax( sal+bonus) tax FROM emp;

 

-- 패키지 삭제

DROP PACKAGE 패키지명;
DROP PACKAGE BODY 패키지명;

선언부를 삭제하게 되면 몸체도 자동으로 삭제가 된다.

+ Recent posts