컴퓨터/Oracle

Oracle (8) - 커서(Cursor)

달서비 2025. 1. 9. 22:44

오라클을 사용하다 보면 여러 행의 데이터 처리해야 하는 경우가 있습니다.  커서를 활용하면 효율적으로 데이터를 다룰 수 있습니다. 커서는 데이터를 반환하는 것뿐만이 아니라 데이터를 한 행씩 읽으면서 특정 로직을 적용하거나 조건에 맞게 가공할 수 있습니다. 프로시저나 트랜잭션 작업에서 데이터를 유연하게 처리할 수 있습니다.

 

커서(Cursor)

커서는 SQL의 데이터 셋을 순차적으로 접근할 수 있는 메모리 영역입니다. 이를 이용하여 쿼리 결과를 한 행씩 처리할 수 있도록 합니다. 쉽게 말하면 C에서 포인터와 같은 기능을 합니다. 이를 활용하면 다음과 같은 이점을 얻을 수 있습니다.

  1. 다중 행 처리: 여러 행의 데이터를 한 번에 여러 행을 반환하거나 각 행을 개별적으로 처리할 수 있습니다.
  2. 복잡한 로직 구현: 프로시저나 함수에서 반복문과 함께 사용하여 복잡한 로직을 구현할 수 있습니다.
  3. 트랜잭션 제어: 데이터를 가공하거나 조건에 맞게 처리하여 트랜잭션을 관리할 수 있습니다.

 

커서의 종류는 크게 두 가지가 있습니다.

  1. 묵시적 커서(Implicit Cursor)
  2. 명시적 커서(Explicit Cursor)

 

묵시적 커서

묵시적 커서는 오라클 내부에서 자동으로 생성되는 커서 SELECT INTO, DML(INSERT, UPDATE, DELETE)이 실행될 때마다 자동으로 만들어져 사용합니다.

DECLARE
    V_STUDENT_NO    STUDENT_INFO.STU_NO%TYPE := '2025123456'

BEGIN
    UPDATE STUDENT_INFO
       SET STU_NAME = (SELECT KOREA_NM 
                         FROM REPORT T2 
                        WHERE T1.STU_NO = T2.STU_NO)
     WHERE STU_NO = V_STUDENT_NO;

    COMMIT;
END;

 

명시적 커서

명시적 커서는 사용자가 직접 선언하고 사용하는 방식의 커서입니다. 명시적 커서를 이용해서 결과 데이터 집합을 각각의 row로 참조하여 작업할 수 있습니다.

DECLARE
    V_STUDENT_NO STUDENT_INFO.STU_NO%TYPE;
    
    CURSOR C1 IS 
        SELECT STU_NO 
          FROM STUDENT_INFO;
         WHERE SUBSTR(STU_NO,1,4) = '2025'

BEGIN
    OPEN C1;
    LOOP
        FETCH C1 INTO V_STUDENT_NO;
        EXIT WHEN C1%NOTFOUND;

        UPDATE STUDENT_INFO T1
           SET STU_NAME = (SELECT KOREA_NM 
                             FROM REPORT T2 
                            WHERE T1.STU_NO = T2.STU_NO)
         WHERE STU_NO = V_STUDENT_NO;

    END LOOP;

    COMMIT;
    CLOSE C1
END;

 

명시적 커서 사용 방법

1. 커서 선언

CURSOR C1 IS 
	SELECT STU_NO 
  	  FROM STUDENT_INFO;

사용할 커서에 이름(C1)을 부여하고 해당 커서에 대한 쿼리를 선언해야 합니다. 데이터 셋을 각 row로 참조하여 사용합니다.

 

2. 커서 열기

OPEN C1;

 

3. Row 가져오기 (FETCH)

LOOP
	FETCH C1 INTO V_STUDENT_NO;
	 EXIT WHEN C1%NOTFOUND;
END LOOP;

FETCH를 이용하여 커서에서 반환되는 각 컬럼값을 변수로 할당할 수 있습니다. 해당 변수를 이용하여 다양한 로직에서 사용할 수 있습니다.

 

4. 커서닫기

CLOSE C1

 

커서와 관련 속성

커서를 이용하여 데이터를 반복적으로 가져오면 데이터의 끝을 확인 할 필요성이 있습니다. 속성을 이용하여 확인 할 수 있으며 몇 가지 유용한 속성을 첨부합니다.

%FOUND 마지막 FETCH가 데이터를 성공적으로 가져왔는지 여부를 반환합니다.
%NOTFOUND FETCH 실패 여부를 반환합니다.
%ROWCOUNT FETCH된 행의 개수를 반환합니다.
%ISOPEN 커서가 열려 있는지 여부를 확인합니다.

 

마지막으로

커서의 사용법을 숙지하면 복잡한 데이터 처리 작업을 효과적으로 수행할 수 있습니다.