좋아, 이거 중요한 개념이야!
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 |