상세 컨텐츠

본문 제목

[오라클 DB 스터디] 커서(Cursor) - 2

프로그래밍 도서

by DeepinDev 2025. 3. 30. 18:14

본문

명시적 커서와 Cursor FOR LOOP 문 활용

FOR record_name IN cursor_name LOOP
-- 명시적 커서의 OPEN, FETCH가 자동으로 수행됨.
    statement1;
    statement2;
....
END LOOP;	-- 루프문을 빠져나갈때 자동으로 커서가 CLOSE됨

record_name: 커서로부터 FETCH된 하나의 레코드를 저장하기 위한 변수(커서레코드 변수), 별도로 선언하지 않아도 자동으로 만들어짐

cursor_name: 처리하려는 명시적 커서 이름, 선언부에서 정의되어야 함.

emp테이블에서 empno, ename값을 가져와서 커서에 저장 후 출력

파라미터 Explicit Cursor

명시적 커서를 선언한 후 OPEN할때 값을 바꾸어서 수행한다. 

CURSOR cursor_name
[(parameter_name dataTYPE, ...)]
IS
	select-statment;

parameter_name 파라미터 변수명으로 변수선언과 동일하며 여러개의 파라미터를 지정할 수 있음

커서를 실행할때 여러 부서 번호를 넣고 해당 학과에 소속된 교수들의 이름을 출력한다

Cursor와 SELECT....FOR UPDATE 문장

SELECT ... FOR UPDATE라는 문장을 사용하면 커서를 선언할 때 커서에 있는 행들에 대해 잠금(LOCK)을 수행한다.

세션1
SELECT empno, ename, sal
   FROM emp
WHERE empno=7900
      FOR update;
세션2
UPDATE emp
       SET sal=1000
 WHERE empno=7900; 
-- 대기상태로 반응이 없음
  • 세션1에서 select구문에 FOR update를 함께 쓰면 해당 데이터에 Lock이 설정되어 다른 세션에서 DML작업을 할 경우 대기 상태로 들어간다. 이런 상태로 있다가 세션1에서 commit이나 rollback명령을 수행하여 transaction을 종료하면 세션2에서도 작업진행이 계속된다.
  • 반대로 세션1이 FOR update를 사용하려 할때 다른 세션에서 그 데이터를 변경하고 있다면 기본적으로 세션1은 그 사용이 끝날때까지 대기하게된다. 이때의 옵션으로는 FOR update nowait, FOR update wait n 이 있다.
  • FOR update nowait는 대기하지 못하고 바로 에러를 표시한다. 
  • FOR update wait n의 n에 시간을 지정하면 그만큼 대기한다. n을 정하지 않으면 무한정 대기하므로 주의한다. 

cursor에서 select ... for update 사용하기

CURSOR cursor_name
[SELECT...
   FROM...
    FOR UPDATE [OF column_reference][NOWAIT | WAIT n];

COMMIT을 꼭 호출해야한다.

strong ref cursor(강한 타입 - 제한적 Ref Cursor)

반드시 타입을 지정해야 하는 커서. Weak Ref Cursor와 다르게 데이터를 받아서 작업할 데이터 타입을 먼저 선언하고 커서를 선언해야 한다. 

emp 테이블에서 empno, enam, job을 ref cursor를 사용하여 변수에 담아 출력한다

 

관련글 더보기

댓글 영역