IT정보

PL/SQL 이란?

YUNOLAND 2008. 7. 3. 11:41

PL/SQL 이란 ?

 
- PL/SQL 은 Oracle's Procedural Language extension to SQL. 의 약자 입니다.

 - SQL문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR)등을 지원하며,
오라클 자체에 내장되어 있는 Procedure Language입니다

 - DECLARE문을 이용하여 정의되며, 선언문의 사용은 선택 사항입니다.  

 -
PL/SQL 문은 블록 구조로 되어 있고 PL/SQL 자신이 컴파일 엔진을 가지고 있습니다.




PL/SQL의 장점

 - PL/SQL 문은 BLOCK 구조다수의 SQL 문을 한번에 ORACLE DB 로 보내서 처리하므로
   
수행속도를 향상 시킬수 있습니다.

 - PL/SQL 의 모든 요소는
하나 또는 두개이상의 블록으로 구성하여 모듈화가 가능하다.

 - 보다 강력한 프로그램을 작성하기 위해서 큰 블록안에 소블럭을 위치시킬 수 있습니다.

 - Variable, Constant, Cursor, Exception을 정의하고, SQL문장과 Procedural 문장에서
   사용합니다. .

 - 단순, 복잡한 데이터형태의 변수를 선언합니다.

 - 테이블의 데이터 구조와 DataBase의 컬럼럼에 준하여 동적으로 변수를 선언 할 수 있습니다.

 - Exception 처리 루틴을 이용하여 Oracle Server Error를 처리합니다.

 - 사용자 정의 에러를 선언하고 Exception 처리 루틴으로 처리 가능 합니다.




package?


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

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


패키지 선언부

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



 


패키지 본문

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



 


아주 간단한 패키지 예제입니다.

4개의 프로시저가 존재하고 있습니다.

프로시저명

프로시저 기능

보기

all_emp_info

  모든 사원의  사원 정보 (사번, 성명, 입사일)

프로시저보기

all_sal_info

  모든 사원의  급여 정보 (평균급여, 최고급여, 최소급여)

프로시저보기

dept_emp_info

  특정 부서의  사원 정보 (사번, 성명, 입사일)

프로시저보기

dept_sql_info

  특정 부서의  급여 정보 (평균급여, 최고급여, 최소급여)

프로시저보기

위 4개의 프로시저를 가지고 패키지를 생성하겠습니다.


선언부를 먼저 생성 합니다.

package 예제
(선언부)

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;

Package created.


선언부를 생성 하고 나서 본문 부분을 생성 합니다.

package 예제
(본문)

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;
         /
 
 Package body created.

 



패키지의 실행

패키지의 실행은 패키지 명 다음에 .을 찍고 프로시저냐 함수 명을 써 줍니다.


먼저 set serveroutput on을 실행한후..
SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)


다음 명령들을 실행해 보세요..
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);

출처: OracleClub.com

'IT정보' 카테고리의 다른 글

Eclipse에 Tomcat 연동하기  (0) 2008.07.08
tnsnames.ora 설정하기 & Oracle Client 접속서버 설정하기  (0) 2008.07.08
Tomcat 설치  (0) 2008.07.08
자바 (JDK)설치&환경 변수 설정  (0) 2008.07.07
SQL 언어의 종류  (0) 2008.07.04