Oracle PL/SQL 강좌
Package(패키지) 20 26 99,999+

by 구루비 PACKAGE 패키지 PACKAGE BODY [2002.01.20]


  패키지(package)는 오라클 데이터베이스에 저장되어 있는 서로 관련있는 PL/SQL 프로지져와 함수들의 집합 이다.

  패키지는 선언부와 본문 두 부분으로 나누어 진다.

패키지 선언절 문법

  • - 선언절은 패키지에 포함될 PL/SQL 프로시저나, 함수, 커서, 변수, 예외절을 선언 한다.
  • - 패키지 선언부에서 선언한 모든 요소들은 패키지 전체에 적용 된다.
  • - 즉 선언부에서 선언한 변수는 PUBLIC 변수로 사용 된다.

패키지 본문 문법

  • - 패키지 본문은 패키지에서 선언된 부분의 실행을 정의 한다.
  • - 즉 실재 프로시져나 함수의 내용에 해당하는 부분이 온다.

아래는 네 개의 프로시저를 하나의 패키지로 생성하는 아주 간단한 예제이다.

프로시저명 프로시저 기능
all_emp_info 모든 사원의 사원 정보 (사번, 성명, 입사일)
all_sal_info 모든 사원의 급여 정보 (평균급여, 최고급여, 최소급여)
dept_emp_info 특정 부서의 사원 정보 (사번, 성명, 입사일)
dept_sql_info 특정 부서의 급여 정보 (평균급여, 최고급여, 최소급여)

패키지 선언부 생성 예제

 
SQL> CREATE OR REPLACE PACKAGE emp_info AS

       PROCEDURE all_emp_info;   -- 모든 사원의  사원 정보
        
        PROCEDURE all_sal_info;   -- 모든 사원의  급여 정보

        -- 특정 부서의  사원 정보
        PROCEDURE dept_emp_info (v_deptno IN  NUMBER) ;

        -- 특정 부서의  급여 정보
        PROCEDURE dept_sal_info (v_deptno IN  NUMBER) ;

    END emp_info;
    /
    

패키지 본문 생성 예제

 
SQL> CREATE OR REPLACE PACKAGE BODY emp_info AS

     -- 모든 사원의  사원 정보 
     PROCEDURE all_emp_info
     IS

         CURSOR emp_cursor IS
         SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
         FROM emp
         ORDER BY hiredate;

     BEGIN

         FOR  aa  IN emp_cursor LOOP

             DBMS_OUTPUT.PUT_LINE('사번 : ' || aa.empno);
             DBMS_OUTPUT.PUT_LINE('성명 : ' || aa.ename);
             DBMS_OUTPUT.PUT_LINE('입사일 : ' || aa.hiredate);

         END LOOP;

         EXCEPTION
           WHEN OTHERS THEN
             DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');

     END all_emp_info;


     -- 모든 사원의  급여 정보 
     PROCEDURE all_sal_info
     IS
    
         CURSOR emp_cursor IS
         SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
         FROM emp;
    
     BEGIN

         FOR  aa  IN emp_cursor LOOP
 
             DBMS_OUTPUT.PUT_LINE('전체급여평균 : ' || aa.avg_sal);
             DBMS_OUTPUT.PUT_LINE('최대급여금액 : ' || aa.max_sal);
             DBMS_OUTPUT.PUT_LINE('최소급여금액 : ' || aa.min_sal);
         
         END LOOP;


         EXCEPTION
            WHEN OTHERS THEN
               DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');
     END all_sal_info;


     --특정 부서의  사원 정보
     PROCEDURE dept_emp_info (v_deptno IN  NUMBER)
     IS

         CURSOR emp_cursor IS
         SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
         FROM emp
         WHERE deptno = v_deptno
         ORDER BY hiredate;

     BEGIN

         FOR  aa  IN emp_cursor LOOP

             DBMS_OUTPUT.PUT_LINE('사번 : ' || aa.empno);
             DBMS_OUTPUT.PUT_LINE('성명 : ' || aa.ename);
             DBMS_OUTPUT.PUT_LINE('입사일 : ' || aa.hiredate);

         END LOOP;

        EXCEPTION
            WHEN OTHERS THEN
               DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');

     END dept_emp_info;


     --특정 부서의  급여 정보
     PROCEDURE dept_sal_info (v_deptno IN  NUMBER)
     IS
    
         CURSOR emp_cursor IS
         SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
         FROM emp 
         WHERE deptno = v_deptno;
             
     BEGIN

         FOR  aa  IN emp_cursor LOOP 
 
             DBMS_OUTPUT.PUT_LINE('전체급여평균 : ' || aa.avg_sal);
             DBMS_OUTPUT.PUT_LINE('최대급여금액 : ' || aa.max_sal);
             DBMS_OUTPUT.PUT_LINE('최소급여금액 : ' || aa.min_sal);
         
         END LOOP;

         EXCEPTION
             WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM||'에러 발생 ');

     END dept_sal_info;        
    
  END emp_info;
  /
    

패키지 실행

패키지의 실행은 패키지 명 다음에 점(.)을 찍고 프로시저냐 함수 명을 적어주면 된다.

 
-- DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용
SQL> SET SERVEROUTPUT ON ; 

-- 패키지 실행
SQL> EXEC emp_info.all_emp_info;

SQL> EXEC emp_info.all_sal_info;

SQL> EXEC emp_info.dept_emp_info(10);

SQL> EXEC emp_info.dept_sal_info(10); 
    

- 강좌 URL : http://www.gurubee.net/lecture/1075

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 반가움 [2005.03.16 13:59:43]
좋은 정보를 많이 봅니다. 책 값을 얼마나 아꼈는지 모릅니다.
님아 언제 만나서 식시라도 합시다. 유용한 정보 요긴하게 써먹겠습니다.

by 김영석 [2005.07.02 14:15:21]
내용도 좋지만 가독성 있게 문서를 잘 만드셨어요.

by 김호영 [2005.10.17 10:04:47]
마음이 따뜻해 지는 문서입니다.

by 강기호 [2005.10.20 13:13:02]
한번 거하게 쏘고 싶어요! ^^

by 학생 [2006.03.15 12:30:36]
오라클 사이트하면 여기가 가장먼저 생각나네여...

by 까만아이 [2006.04.03 18:03:00]
길게 설명만 쭉~ 늘어져 있는 책 보는거 보다...
확 와닫고 이해가 가네요 ^^
오라클클럽에서 많은걸 배우네요... 수고하십쇼~!

by 레오나 [2006.08.11 18:31:31]
스팩에서 변수는 어떻게 넣어야 하나요 방법좀 알려주세요

by ITEAtom [2006.09.07 11:40:57]
스팩에서 선언 하고 초기값 주고 싶으면 주면 됩니다.
그리고 사용은 body 에서 사용하면 되고요.
스팩에 선언한 변수는 body 에서 전역으로 쓰입니다.
count 같은 변수로 주로많이 쓰이죠.
spec : g_count number := 0;
body : g_count := g_count + sql%rowcount;
이런 식으루요. 저도 아직 학생이라 ㅋ

by plz [2006.09.22 13:22:27]
이미 생성되어있는 패키지에 프로시저를 추가하려면 어떻게 해야하나요??

by hyperhand [2006.09.28 11:05:19]
패키지내의 이미 정의되어 있는 프로시저나 함수를 수정하려면 어찌해야 하나요?

by 김석오 [2006.10.25 15:42:35]
이거 토드에서 만드는건 되는데 실행은 안되나요? 토드에서 원격에 있는 DB에 이 팩키지 만들고 SQL_PLUS 로 실행하면 실행되고 토드에서 하면 값이 안나오네요

by 5썬 [2007.01.30 13:30:14]
SET SERVEROUTPUT ON 을 먼저 써주시고 명령문을 입력한다음 F5키를 누르시면 토드에서도 값이 나옵니다.
(한글은 깨지던데 이거 제대로 나오게 하는 방법아시는분 있으신가요?)

by darkturtle [2007.02.04 13:22:01]
한글 깨지는건 보통 Server 와 Client NLS 관련 Parameter 가 다른 경우
Server 와 동일 하게 맞쳐주시면 안깨집니다.

by 외Rony [2007.09.06 16:41:46]
예제에 있는 패키지를 생성해보니까 END Package_Name; 이 마지막 부분에서
END; 이렇게 Package_Name을 없애야지만 컴파일 오류없이 패키지가 생성이 되었습니다. 참고로 Oracle10g 사용 중 입니다.
여기까지 따라오면서 정말 많은 것을 배웠습니다. 감사합니다.

by 유동필 [2007.11.08 11:51:24]
package를 실행해도 컴파일 오류와 함께 패키지 본문이 생성되었다는 오류가 뜹니다.어떻게 해야할가요?

by 김윤경 [2007.11.20 17:35:31]
좋은 강좌 감사합니다.

by 이존우 [2008.08.18 10:22:45]
오라클로 간만에 프로젝트 하다보니 기억이 않나서 정리 할겸 들린 사이트인데
아주 정리가 잘되 있군요. 강추 입니다.

by 11 [2009.02.19 02:38:32]
1651651

by khk [2009.09.09 15:01:06]
실전 응용 책 내셔두 더 잘팔릴거같아요

by 윤노인 [2011.06.15 16:56:33]
이거 보면서 열심히 달리고 있습니다~
감사합니다 ^^

by 쫑 [2012.01.27 17:01:55]
알기 쉽게 되어 있네요^.^

by 잠만자 [2012.03.25 17:53:26]
그런데 패키지 선언부에서 "파라미터 v_deptno IN NUMBER)" 를 선언했는데 왜 본문에서 또 선언을 해야만 작동할까요?

by 손님 [2012.05.09 14:33:39]

프록시져에 사경을 헤메고 있다가 단비와도 같은 강좌 였습니다.. 감사합니다. ^^

by 열혈성민 [2013.01.21 11:13:55]

오라클계의 대부..
정말 많은 도움 받아갑니다;;;;

저녁식사라도 한번 같이 하고 싶습니다

by 전승규 [2018.11.21 11:01:27]

좋은 내용 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입