P/L SQL PACKAGE

오라클 데이터베이스에 저장되어 있는 프로시저, 함수들의 집합체이며 패키지의 구성은

선언부(Specification)과 본문(Body)로 구성됨.

 

1. 형식

 

--Specification 부분

CREATE [OR REPLACE] PACKAGE package_name

[AUTHID {CURRENT_USER | DEFINER}]

{IS | AS }

[PRAGMA SERIALLY_REUSABLE;]

[collection_type_definition …]

[record_type-definition …]

[subtype_definition …]

[collection_declaration …]

[constant_declaration …]

[exception_declaration …]

[object_declaration …]

[record_declaration …]

[variable_declaration …]

[cursor_spec …]

[function_spec …]

[procedure_spec …]

[call_spec …]

[PRAGMA RESTRICT_REFERENCES (assertions) …]

END [package_name];

 

--Body 부분

[CREATE [OR REPLACE] PACKAGE BODY package_name {IS | AS}

[PRAGMA SERIALLY_REUSABLE;]

[collection_type_definition …]

[record_type-definition …]

[subtype_definition …]

[collection_declaration …]

[constant_declaration …]

[exception_declaration …]

[object_declaration …]

[record_declaration …]

[variable_declaration …]

[cursor_body …]

[function_spec …]

[procedure_spec …]

[call_spec …]

[BEGIN

  squence_of_statements]

END [package_name]; ]

 

여기서 패키지 선언부(Specification)은 패키지에 포함될 PL/SQL 프로시저 및 함수 외에 퍼블릭(Public) 변수 선언과 커서(Cursor) 및 예외절 등을 포함한다.

여기서 퍼블릭 변수는 패키지 전체에 적용되는 변수임을 기억하자.

다음으로 패키지 본문(Body)는 패키지 선언부에서 선언된 변수들, 프로시저, 함수 들을 정의하는 부분이다.

 

실제 EMP 테이블의 클론인 EMP_BACK 테이블을 가지고 알아보자.

 

사용자 삽입 이미지

2. 패키지 선언과 본문 스크립

--패키지 선언(Specification)

CREATE OR REPLACE PACKAGE emp_back_pack

IS

  v_counter NUMBER :=0;

  PROCEDURE empno_out;

  PROCEDURE ename_out;

  PROCEDURE job_out;

  PROCEDURE hiredate_out; 

  PROCEDURE deptno_out;

  PROCEDURE salary_out;

END emp_back_pack;

/

 

 

--패키지 본문(BODY)

CREATE OR REPLACE PACKAGE BODY emp_back_pack

IS

  -- emp_back_cursor 생성

  CURSOR emp_back_cursor IS

    SELECT * FROM EMP_BACK;

 

  -- emp_back_procedure

  PROCEDURE empno_out IS

  BEGIN

               DBMS_OUTPUT.ENABLE;

                DBMS_OUTPUT.PUT_LINE('직원번호');

                DBMS_OUTPUT.PUT_LINE('--------------');

               

                FOR crec IN emp_back_cursor LOOP

                            DBMS_OUTPUT.PUT_LINE('       ' || TO_CHAR(crec.empno));

                END LOOP;

  END empno_out;

 

  -- emp_back_ename_out 

  PROCEDURE ename_out IS 

  BEGIN

               DBMS_OUTPUT.ENABLE;

                DBMS_OUTPUT.PUT_LINE('직원이름');

                DBMS_OUTPUT.PUT_LINE('--------------');         

 

                FOR crec IN emp_back_cursor LOOP

                            DBMS_OUTPUT.PUT_LINE('       ' || crec.ename);

                END LOOP;

  END ename_out;  

 

  -- emp_back_job_out 

  PROCEDURE job_out IS 

  BEGIN

               DBMS_OUTPUT.ENABLE;

                DBMS_OUTPUT.PUT_LINE('업무 직함');

                DBMS_OUTPUT.PUT_LINE('--------------');         

 

                FOR crec IN emp_back_cursor LOOP

                            DBMS_OUTPUT.PUT_LINE('       ' || crec.job);

                END LOOP;

  END job_out;

 

  -- emp_back_hiredate_out 

  PROCEDURE hiredate_out IS 

  BEGIN

               DBMS_OUTPUT.ENABLE;

                DBMS_OUTPUT.PUT_LINE('입사일');

                DBMS_OUTPUT.PUT_LINE('--------------');         

 

                FOR crec IN emp_back_cursor LOOP

                            DBMS_OUTPUT.PUT_LINE('       ' || crec.hiredate);

                END LOOP;

  END hiredate_out;

 

  -- emp_back_deptno_out 

  PROCEDURE deptno_out IS 

  BEGIN

               DBMS_OUTPUT.ENABLE;

                DBMS_OUTPUT.PUT_LINE('부서번호');

                DBMS_OUTPUT.PUT_LINE('--------------');         

 

                FOR crec IN emp_back_cursor LOOP

                            DBMS_OUTPUT.PUT_LINE('       ' || TO_CHAR(crec.deptno));

                END LOOP;

  END deptno_out;  

 

  -- emp_back_salary_out 

  PROCEDURE salary_out IS 

  BEGIN

               DBMS_OUTPUT.ENABLE;

                DBMS_OUTPUT.PUT_LINE('월급');

                DBMS_OUTPUT.PUT_LINE('--------------');         

 

                FOR crec IN emp_back_cursor LOOP

                            DBMS_OUTPUT.PUT_LINE('       ' || TO_CHAR(crec.sal));

                END LOOP;

  END salary_out;  

END emp_back_pack;

/

 

3. 실행 결과

패키지 선언부 생성


사용자 삽입 이미지

                         
패키지 본문 생성
사용자 삽입 이미지
사용자 삽입 이미지
실행결과
사용자 삽입 이미지

SQL>SET SERVEROUTPUT ON 을 실행한 후 위와 같이 EXECUTE 문을 써서 실행하면
원하는 결과를 얻을 수 있음.
추가적인 기능들이나 응용을 배우는 것은 독자들에게 남겨둡니다.
그럼 이만.



Posted by 원철연(체르니)
,