C#,Delphi,Oracle,MSSQL 개발자블로그

[Oracle/PLSQL]6.패키지 개념 추가 정보 본문

Programming/Oracle 공부

[Oracle/PLSQL]6.패키지 개념 추가 정보

19760323 2017. 6. 23. 10:20

● 오버로드

 

하나의 패키지 여러 서브프로그램 동일한 이름을 사용할 수 있다.

동일한 이름의 여러 서브프로그램을 구분하려면 형식 매개변수 개수, 순서 또는 테이터 유형 계열은 달라져야 한다.

- 제한사항 : 로컬 또는 패키지 서브프로그램만 오버로드 할 수 있다.

 

Ex.

 

- 패키지 명세 작성.

 

CREATE OR REPLACE PACKAGE over_pack
IS
    PROCEDURE add_dept
        (v_deptno IN dept.deptno%TYPE,
         v_name   IN dept.dname%TYPE DEFAULT 'unknown',
         v_loc    IN dept.loc%TYPE   DEFAULT 'unknown');
    PROCEDURE add_dept
        (v_name   IN dept.dname%TYPE DEFAULT 'unknown',
         v_loc    IN dept.loc%TYPE   DEFAULT 'unknown');
END over_pack;

 

- 패키지 몸체 작성.

 

CREATE OR REPLACE PACKAGE BODY over_pack
IS
    PROCEDURE add_dept
        (v_deptno IN dept.deptno%TYPE,
         v_name   IN dept.dname%TYPE DEFAULT 'unknown',
         v_loc    IN dept.loc%TYPE   DEFAULT 'unknown')
    IS
    BEGIN
        INSERT INTO dept
        VALUES (v_deptno, v_name, v_loc);
    END add_dept;
    PROCEDURE add_dept
        (v_name   IN dept.dname%TYPE DEFAULT 'unknown',
         v_loc    IN dept.loc%TYPE   DEFAULT 'unknown')
    IS
    BEGIN
        INSERT INTO dept
        VALUES (dept_deptno.NEXTVAL, v_name, v_loc);
    END add_dept;
END over_pack;

 

- 필요한 시퀀스 생성 예제.

 

CREATE SEQUENCE dept_deptno
   INCREMENT BY 1
     START WITH 1
        NOCACHE
        NOCYCLE

 

☞ 필요시 시퀀스 강제증가 구문.

ALTER SEQUENCE 시퀀스명 INCREMENT BY 증가 값.

 

- 실행.

 

EXECUTE OVER_PACK.ADD_DEPT (76,'MARKETING','ATLANTA')

EXECUTE OVER_PACK.ADD_DEPT ('SUPPORT', 'ORLANDO')

 

☞ 같은 패키지 서브프로그램이라도 입력하는 매개변수에 따라 다르게 동작한다.

 

● 사전 선언(Forward Declarations)

 

PL/SQL은 절차적언어이므로, 패키지내에서 서브프로그램을 호출하려고 할 때,

호출할 서브프로그램을 선언부에서 미리 선언해주거나,

호출할 서브프로그램이 호출하는 서브프로그램보다 상단에 정의되어 있어야 한다.

 

Ex.

 

- 호출할 서브프로그램이 아래쪽에 선언되어 있는 경우 호출할 수 없다.

 

CREATE OR REPLACE PACKAGE BODY forward_pack
IS

    PROCEDURE award_bonus(. . .)
    IS
    BEGIN
        calc_rating(. . .);           -- 호출할 서브프로그램이 하단에 정의되어 있고, 선언부에도 선언되어 있지 않으므로 에러.
    END;
   
    PROCEDURE calc_rating(. . .)
    IS
    BEGIN
   
    END;
END forward_pack;

 

- 서브프로그램을 미리 선언해서 정상 작동이 되는 경우.

 

CREATE OR REPLACE PACKAGE BODY forward_pack
IS
    PROCEDURE calc_rating(. . .);   

    PROCEDURE award_bonus(. . .)
    IS
    BEGIN
        calc_rating(. . .);
    END;
   
    PROCEDURE calc_rating(. . .)
    IS
    BEGIN
   
    END;
END forward_pack;

 

 

 

 

 

 

 

Comments