ROWID를 이용하지 않고 커서의 WHERE CURRENT OF 를 이용하여 업데이트와 삭제가 일어나도록 하는 작업이다.

이는 반드시 참조 커서가 있어야하며 FOR문 안에 업데이트 또는 삭제 쿼리가 존재해야한다.

다음은 그 예제이다.

CREATE OR REPLACE PROCEDURE TEST

IS

CURSOR v_cursor IS

SELECT * FROM TABLE;

BEGIN

FOR list IN v_cursor LOOP

UPDATE TABLE

SET NO = 1

WHERE CURRENT OF v_cursor;

END LOOP;

EXCEPTION

WHEN OTHERS THEN 작업 내용

END;

FOR문에서의 커서는 자동적으로 OPEN, FETCH, CLOSE가 일어난다.

다음은 그 예제이다.

CREATE OR REPLACE PROCEDURE TEST

IS

CURSOR v_cursor IS

SELECT * FROM TABLE;

BEGIN

FOR list IN v_cursor LOOP

처리 내용

END LOOP;

EXCEPTION

WHEN OTHERS THEN 처리 내용

END;

커서 상에서 인자 값도 당연히 넣을 수가 있다.

v_cursor(인자) 설정을 하고 FOR문 상에서도 v_cursor(인자) 로 적용시켜서 동작시키면 된다.

개발자에 의해 정의되는 커서이다.

커서의 순서로는 OPEN->FETCH->CLOSE 순으로 일어난다.

먼저 예제를 보자.

CREATE OR REPLACE PROCEDURE TEST

IS

CURSOR v_cursor IS

SELECT * FROM TABLE;

v_no TABLE.NO%TYPE;

BEGIN

OPEN v_cursor;

FETCH v_cursor INTO v_no;

CLOSE v_cursor;

EXCEPTION WHEN OTHERS THEN 처리내용

END;

위에서 OPEN은 커서를 열어주는 역할을 한다. 커서 내부에서 검색이 일어나고 아무런 결과를 얻지 못다허라도 에러는 발생하지 않는다.

FETCH는 현재 데이터 행을 OUTPUT 변수에 반환하며 커서의 SELECT의 컬럼 수와 OUTPUT 변수 수가 동일해야하며 타입 역시 마찮가지이다. 이들은 한 ROW씩 데이터를 FETCH한다.

CLOSE는 마지막으로 커서를 닫아주는 역할을 한다.

 

암시적 커서는 오라클 또는 PL/SQL 실행에 의해 처리되는 SQL 작업소라고 생각을 하면 된다.

이들은 자동적으로 커서가 OPEN과 CLOSE가 일어나며 속성은 다음과 같다.

속성

설명 

SQL%ROWCOUNT

SQL 영향 받는 ROW 수

SQL%FOUND

SQL 영향 행 수가 하나 이상의 경우 TRUE 

SQL%NOTFOUND

SQL 영향을 받는 행 수가 없을 경우 TRUE

SQL%ISOPEN

항상 FALSE로 커서가 열려있는지를 확인

사용하는 방법은 다음 예제를 보면 알 수 있다.

CREATE OR REPLACE PROCEDURE TEST

IS

v_data TABLE.NO%TYPE;

BEGIN

SELECT NO

INTO v_data

FROM TABLE

WHERE NO = 1

IF 속성 THEN

처리내용

END IF

END;

암시적 속성의 경우 사용자가 직접 커서를 컨트롤 하는 것이 아니기 때문에 위와 같이 속성 값을 이용하여 체크가 가능하다.