대덕인재/Oracle

[Oracle D-18] 커서 (CURSOR)/ 암시적 커서 (implicit cursor)와 명시적 커서 (explicit cursor)

꼬마버거 2025. 4. 24. 11:57

좋아, 이거 중요한 개념이야!
Oracle PL/SQL에서 **CURSOR(커서)**는 쉽게 말해서 👉
"SELECT 결과를 한 줄씩 차례로 처리할 수 있게 해주는 포인터" 같은 거야.

 

🔍 왜 커서가 필요해?

SELECT * FROM EMP;
 

이런 쿼리는 여러 줄(레코드)을 가져오지?
근데 PL/SQL에서는 SELECT INTO문으로는 한 줄만 가져올 수 있어.
그래서 여러 줄을 하나씩 순서대로 처리하고 싶을 때 CURSOR를 사용하는 거야.


✅ 커서 기본 구조

DECLARE
    CURSOR 커서이름 IS
        SELECT문; -- 여러 줄 결과
BEGIN
    FOR 레코드변수 IN 커서이름 LOOP
        -- 레코드별 작업 수행
    END LOOP;
END;

 


📌 예제: 직원 이름 모두 출력하기

 
DECLARE
    CURSOR emp_cursor IS
        SELECT ENAME, SAL FROM EMP;

BEGIN
    FOR emp_record IN emp_cursor LOOP
        DBMS_OUTPUT.PUT_LINE('이름: ' || emp_record.ENAME || ', 급여: ' || emp_record.SAL);
    END LOOP;
END;
 

🔹 여기서:

  • emp_cursor: SELECT 결과를 담는 커서
  • emp_record: 커서에서 꺼낸 한 줄(row)

💡 커서는 두 가지 방식이 있어


 

타입 설명
암시적 커서 SELECT INTO처럼 자동으로 처리되는 커서 (단일행)
명시적 커서 CURSOR ~ IS SELECT로 선언해서 여러 행 처리 (반복 필요)

📘 잠깐만! 그럼 명시적 커서랑 암시적 커서가 뭐야?

1. 📌 암시적 커서 (implicit cursor)

  • SELECT INTO, INSERT, UPDATE, DELETE 등 SQL 문을 실행할 때 자동으로 만들어짐
  • 우리가 직접 OPEN, FETCH, CLOSE 안 해도 됨
DECLARE
    v_name EMP.ENAME%TYPE;
BEGIN
    SELECT ENAME INTO v_name FROM EMP WHERE EMPNO = 7369; -- 암시적 커서
    DBMS_OUTPUT.PUT_LINE('이름: ' || v_name);
END;

이건 내부적으로 Oracle이 알아서 커서를 열고 닫음 (그래서 OPEN 같은 거 필요 없음!)


2. 📌 명시적 커서 (explicit cursor)

  • CURSOR my_cursor IS SELECT ... 처럼 직접 선언하고,
  • 반복 처리 등 원하는 방식으로 커서를 수동 제어할 수 있음
DECLARE
    CURSOR my_cursor IS SELECT ENAME FROM EMP;
    v_name EMP.ENAME%TYPE;
BEGIN
    OPEN my_cursor;
    FETCH my_cursor INTO v_name;
    CLOSE my_cursor;
END;

✅ 정리: 언제 어떤 커서가 쓰이냐?


 

상황 커서 종류 OPEN / FETCH / CLOSE 필요?
SELECT INTO, INSERT, UPDATE, DELETE 암시적 커서 ❌ 자동으로 처리됨
CURSOR ... IS SELECT ... 명시적 커서 ✅ 수동으로 해야 함
FOR record IN cursor LOOP 명시적 커서지만 자동 루프 ❌ 내부적으로 자동 처리

💡 헷갈릴 때 이렇게 기억하자

  • 내가 직접 CURSOR ~ IS 쓰면 명시적
  • Oracle이 알아서 해주는 건 암시적
  • 명시적은 OPEN/FETCH/CLOSE, 암시적은 걱정 안 해도 됨

🧠 한 줄 요약

CURSOR는 여러 행을 반복해서 처리하기 위해 사용하는 도구!
FOR LOOP랑 같이 쓰면 한 줄씩 순서대로 꺼내서 작업할 수 있어!

 

 

 

'대덕인재 > Oracle' 카테고리의 다른 글

[Oracle D-19] 함수(Function)  (0) 2025.04.25
[Oracle D-19] 프로시저 (Procedure)  (0) 2025.04.25
[Oracle D-18] 반복문  (0) 2025.04.24
[Oracle D-18] 변수  (0) 2025.04.24
[Oracle D-18] 분기문  (0) 2025.04.24