본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] PACKAGE(패키지)

--■■■ PACKAGE(패키지)■■■
/*
 1. PL/SQL 의 패키지는 관계되는 타입, 프로그램 객체, 서브 프로그램(PROCEDUER, FUNCTION)을
 논리적으로 묶어놓은 것으로
 오라클에서 제공하는 패키지 중 하나가 바로 DBMS_OUTPUT 이다


2. 패키지는 서로 유사한 업무에 사용되는 여러 개의 프로시저와 함수를
하나의 패키지로 만들어 관리함으로써 향후 유지보수가 편리하고
전체 프로그램을 모듈화 할 수 있는 장점이 있다.



3. 패키지는 명세부(PACKAGE SPECIFICATION) 와
몸체부(PACKAGE BODY)로 구성되어 있으며
명세부분에는 TYPE, CONSTRAINT, VARIABLE, EXCEPTION, CURSOR, SUBPROGRAM 이 선언되고
몸체부분에는 이들의 실제 내용이 존재하게 된다.
그리고 호출할 때에는 『패키지명.프로시저명 형식』의 참조를 이용해야 한다.


4. 형식 및 구조(명세부)

CREATE [OR REPLACE] PACKAGE 패키지명
IS
    전역변수 선언;
    커서 선언;
    예외 선언;
    함수 선언;
    프로시저 선언;
       :
       
END 패키지명;



--5. 형식 및 구조(몸체부)

CREATE [OR REPLACE] PACKAGE BODY 패키지명
IS
    FUNCTION 함수명 [(인수, ...)]
    RETURN 자료형
    IS
        변수 선언;
    BEGIN
        함수 몸체 구성 코드;
        RETURN 값;
    END;
    
    PROCEDURE 프로시저명[(인수, ...)]
    IS
        변수선언;
    BEGIN
        프로시저 몸체 구성 코드;
    END;    
    
END 패키지명;
*/

 

 

-- ● 주민번호 입력 시 성별을 반환하는 함수
-- 이 함수를 구성요소로 취하는 패키지 작성
-- 함수 준비
CREATE OR REPLACE FUNCTION FN_GENDER(V_SSN VARCHAR2)
RETURN VARCHAR2
IS
    V_RESULT VARCHAR2(20);
BEGIN
    IF SUBSTR(V_SSN,8,1) IN ('1','3') 
            THEN V_RESULT := '남자';
    ELSIF SUBSTR(V_SSN,8,1) IN ('2','4') 
            THEN V_RESULT := '여자';
    ELSE
        V_RESULT := '확인불가';
    END IF;
    RETURN V_RESULT;
END;
--==>>Function FN_GENDER이(가) 컴파일되었습니다.

PACKAGE 를 구성하는 함수를 미리 만들기로 함.

FN_GENDER 라는 함수는 주민등록번호를 매개변수 V_SSN 으로 넘겨주면 남자인지 여자인지 판별하고

그 결과를 VARCHAR 타입의 V_RESULT로 RETURN 해주는 함수이다. 

 

-- 패키지 등록
-- 1. 명세부 작성
-- 2. 몸체부 작성


-- 패키지 등록
-- 1. 명세부 작성
CREATE OR REPLACE PACKAGE INSA_PACK
IS
    FUNCTION FN_GENDER(V_SSN VARCHAR2)
    RETURN VARCHAR2;
    
END INSA_PACK;
--==>>Package INSA_PACK이(가) 컴파일되었습니다.

ㅍ 패키지를 등록하기 위해서는 명세부를 작성하고 몸체부를 작성해야 한다. 명세부는 패키지 안에 어떤 프로시저 함수들이 있는지 보여주고 몸체부에서는 그러한 것들을 정의한다.

 

INSA_PACK 이라는 패키지의 명세부를 작성한 것을 보면 FN_GENDER() 함수가 포함된다

 

 

-- 2. 몸체부 작성

CREATE OR REPLACE PACKAGE BODY INSA_PACK
IS
    FUNCTION FN_GENDER(V_SSN VARCHAR2)
    RETURN VARCHAR2
    IS
        V_RESULT VARCHAR2(20);
    BEGIN
        IF SUBSTR(V_SSN,8,1) IN ('1','3') 
                THEN V_RESULT := '남자';
        ELSIF SUBSTR(V_SSN,8,1) IN ('2','4') 
                THEN V_RESULT := '여자';
        ELSE
            V_RESULT := '확인불가';
        END IF;
        RETURN V_RESULT;
    END;
        

END INSA_PACK;
--==>>Package Body INSA_PACK이(가) 컴파일되었습니다.

위에서는 CREATE OR REPLACE PACKAGE 패키지명

이었다면

몸체부는 CREATE OR REPLACE PACKAGE BODY 패키지명 이다.

(그냥 딱히 명세부를 작성한다. 몸체부를 작성한다 라고 나누기보다는 패키지를 만든다, 패키지바디를 만든다 로 보는게 더 쉽지 않나 어쨋든 한자어는 뭔가 일을 복잡하게 만든다. 차라리 영어만 쓰는 게 낫겠다...는 영어못함)

 

위에서 CREATE OR REPLACE를 했기 때문에

일반적으로 CREATE OR REPLACE FUNCTION 함수명 () RETURN IS BEGIN END;

이렇게 함수를 정의하는데 반해

BODY 에서는 바로 FUNCTION 함수명() RETURN IS BEGIN END; 로 정의한다. 

-- ● 구성한 패키지가 유효한지 확인(테스트)
-- → 패키지에 논리적으로 구성된 함수 호출 확인

SELECT INSA_PACK.FN_GENDER('757575-1234566')
FROM DUAL;

그래서 그 결과를 FROM DUAL을 통해 살펴보면

INSA_PACK.FN_GENDER(매개변수)

이렇게 함수호출해서 사용한다.

저 코드의 결과는 8번째 자리가 1 이므로 남자

 

 

이렇게 패키지는 간단하게 살펴보고 끄웉!

지금은 함수만 살펴봤지만

패키지 바디말고 패키지 작성할 때 전역변수, 프로시저, 커서, 예외 다 선언한다는데 

그 부분은 지금 안보고 지나가서 약간 찝찝