Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the ultimate-member domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /ledcorps/www/wp/wp-includes/functions.php on line 6114 6.2.1 명시적 커서(EXPLICIT CURSOR) – 대나무숲

6.2.1 명시적 커서(EXPLICIT CURSOR)

출처 http://www.gurubee.net/lecture/1064

커서란 무엇인가?

  • – 커서는 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
    

답글 남기기 0

Your email address will not be published. Required fields are marked *