커서란 무엇인가?

  • - 커서는 Private SQL의 작업 영역이다.
  • - 오라클 서버에 의해 실행되는 모든 SQL문은 연관된 각각의 커서를 소유하고 있다.
  • - 커서의 종류
    • 암시적 커서 : 모든 DML과 PL/SQL SELECT문에 대해 선언된다.
    • 명시적 커서 : 프로그래머에 의해 선언되며 이름이 있는 커서이다.

Explicit Cursor의 흐름도?

문법(Syntax)

커서 열기(OPEN)

  • - 커서의 열기는 OPEN문을 사용한다.
  • - 커서안의 검색이 실행되며 아무런 데이터행을 추출하지 못해도 에러가 발생하지 않는다.
  • - 문법 : OPEN cursor_name;

커서 패치(FETCH)

  • - 커서의 FETCH는 현재 데이터 행을 OUTPUT변수에 반환 한다.
  • - 커서의 SELECT문의 컬럼의 수와 OUTPUT변수의 수가 동일해야 한다.
  • - 커서 컬럼의 변수의 타입과 OUTPUT변수의 데이터 타입도 동일해야 한다.
  • - 커서는 한 라인씩 데이터를 패치 한다.
  • - 문법 : FETCH cursor_name INTO variable1, variable2;

커서 닫기(CLOSE)

  • - 사용을 맞친 커서는 반드시 닫아 주어야 한다.
  • - 필요하다면 커서를 다시 열 수 있다.
  • - 커서를 닫은 상태에서 FETCH를 할 수 없다.
  • - 문법 : CLOSE cursor_name;

Explicit Cursor 예제

-- 특정 부서의 평균급여와 사원수를 출력..
SQL> CREATE OR REPLACE PROCEDURE ExpCursor_Test
       (v_deptno IN  dept.deptno%TYPE)
      
     IS

       CURSOR dept_avg IS
       SELECT b.dname, COUNT(a.empno) cnt,
               ROUND(AVG(a.sal),3) salary
       FROM emp a, dept b
       WHERE a.deptno = b.deptno
         AND b.deptno = v_deptno
       GROUP BY b.dname ;

       -- 커서를 패치하기 위한 편수 선언
       v_dname   dept.dname%TYPE;
       emp_cnt   NUMBER;
       sal_avg   NUMBER;

     BEGIN

       -- 커서의 오픈
       OPEN dept_avg;

       -- 커서의 패치
       FETCH dept_avg INTO v_dname, emp_cnt, sal_avg;
 
       DBMS_OUTPUT.PUT_LINE('부서명 : ' || v_dname);
       DBMS_OUTPUT.PUT_LINE('사원수 : ' || emp_cnt);
       DBMS_OUTPUT.PUT_LINE('평균급여 : ' || sal_avg);

       -- 커서의 CLOSE
       CLOSE dept_avg;     

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

   END;
   /

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

SQL> EXECUTE ExpCursor_Test(30);
부서명 : SALES
사원수 : 6
평균급여 : 1550.833  

'프로그램 > DB' 카테고리의 다른 글

Oracle Procedure - 01  (0) 2012.03.11
Oracle Function - 01  (0) 2012.03.11
[펌] 프로시저(Procedure)  (0) 2012.01.30
[펌] 함수(Function)  (0) 2012.01.30
[펌] 특정 컬럼명을 사용하는 테이블 찾기 (Oracle 10g+)  (0) 2011.09.29

+ Recent posts