오라클을 사용하다 보면 여러 행의 데이터 처리해야 하는 경우가 있습니다. 커서를 활용하면 효율적으로 데이터를 다룰 수 있습니다. 커서는 데이터를 반환하는 것뿐만이 아니라 데이터를 한 행씩 읽으면서 특정 로직을 적용하거나 조건에 맞게 가공할 수 있습니다. 프로시저나 트랜잭션 작업에서 데이터를 유연하게 처리할 수 있습니다.
커서(Cursor)
커서는 SQL의 데이터 셋을 순차적으로 접근할 수 있는 메모리 영역입니다. 이를 이용하여 쿼리 결과를 한 행씩 처리할 수 있도록 합니다. 쉽게 말하면 C에서 포인터와 같은 기능을 합니다. 이를 활용하면 다음과 같은 이점을 얻을 수 있습니다.
- 다중 행 처리: 여러 행의 데이터를 한 번에 여러 행을 반환하거나 각 행을 개별적으로 처리할 수 있습니다.
- 복잡한 로직 구현: 프로시저나 함수에서 반복문과 함께 사용하여 복잡한 로직을 구현할 수 있습니다.
- 트랜잭션 제어: 데이터를 가공하거나 조건에 맞게 처리하여 트랜잭션을 관리할 수 있습니다.
커서의 종류는 크게 두 가지가 있습니다.
- 묵시적 커서(Implicit Cursor)
- 명시적 커서(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 | 커서가 열려 있는지 여부를 확인합니다. |
마지막으로
커서의 사용법을 숙지하면 복잡한 데이터 처리 작업을 효과적으로 수행할 수 있습니다.
'컴퓨터 > Oracle' 카테고리의 다른 글
Oracle (7) - 인덱스를 타는지 확인하는 방법 (EXPLAIN PLAN) (1) | 2024.12.28 |
---|---|
Oracle (6) - ORA-01427 : 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다 (0) | 2024.03.07 |
Oracle (5) - SELECT문에서 IF ELSE를 사용하기 DECODE (2) | 2023.12.23 |
Oracle (4) - null값을 치환하는 방법 (NVL, NVL2, COALESCE) (1) | 2023.12.06 |
Oracle (3) - 순위처리를 해보자 (RANK, DENSE_RANK, ROW_NUMBER) (0) | 2023.11.06 |