PL SQL

PL/SQL 명시적 커서, 암시적 커서 (Implicit Cursor, Explicit Cursor) - 2

n.han 2016. 7. 6. 10:41

3) 명시적 커서 FOR LOOP

명시적 커서 FOR LOOP를 사용하면 FOR LOOP자동적으로 커서를 OPEN해주며, 행이 없을 때까지 FETCH해주고, CLOSE해준다. 또한 ROWTYPE에 해당하는 변수를 따로 DECLARE할 필요가 없다. 이는 암시적으로 선언되기 때문이다. 물론, 암시적 카운터는 FOR LOOP안에서만 사용할 수 있다. 그리고 이 커서의 데이터 타입(컬럼 데이터 타입의 집합) %ROWTYPE 앞으로 이용할 수 있다.
다음 예제는 명시적 커서를 FOR LOOP를 이용하여 구현한 예제이다.

 

DECLARE
  CURSOR emp_cur
  IS
    SELECT * FROM emp WHERE deptno = 10 ;
BEGIN
  FOR emp_rec IN emp_cur
  LOOP
    DBMS_OUTPUT.PUT_LINE ( emp_rec.empno || ' ' || emp_rec.ename ) ;
  END LOOP ;
END ;
/
7782 CLARK
7839 KING
7934 MILLER
PL/SQL procedure successfully completed

 

이는 서브쿼리를 활용한 CURSOR FOR LOOP를 활용하면 CURSOR도 선언할 필요가 없어지게 된다.

 

BEGIN
  FOR emp_rec IN
  ( SELECT * FROM emp WHERE deptno = 10
  )
  LOOP
    DBMS_OUTPUT.PUT_LINE ( emp_rec.empno || ' ' || emp_rec.ename ) ;
  END LOOP ;
END ;
/
7782 CLARK
7839 KING
7934 MILLER
PL/SQL procedure successfully completed.

 

CURSOR FOR LOOP은 내부적으로 처리되는 데이터의 양, I/O 측면에서 훨씬 효율적이기 때문에, 가급적 이를 사용하는 것이 좋다.

 

4) 명시적 커서 속성

명시적 커서 속성을 사용하여 커서에 대한 상태 정보를 획득할 수 있다. 다음 표는 명시적 커서 속성의 몇가지 예이다.

 

속성

설명

커서명%FOUND

가장 최근 패치가 행을 반환하면 TRUE

커서명%NOTFOUND

가장 최근 패치가 행을 반환하지 않으면 TRUE

커서명%ISOPEN

커서가 열려 있으면 TRUE

커서명%ROWCOUNT

지금까지 반환된 총 행 수