○SQL문이 실행됐을 때 해당 SQL문을 처리하는 정보를 저장하는 메모리 공간 -> Private SQL Area, 이 메모리의 포인터 -> 커서
○ PL/SQL에서 사용되며 가장 중요한 부분임
○ 테이블의 내용을 커서에 넣어 놓고 PL/SQL문의 변수로 불러와서 사용하는 것임 -> 변수로 불러올 때 루프 사용하여 Iterator처럼 첫번째 행부터 차례로 하나씩 가져옴
● 명시적 커서 : 사용자가 선언 후 사용, 저장되는 데이터는 여러개의 행 가능
- 커서 선언(declare) -> 열기(open) -> 사용(fetch) -> 닫기(close)
- 서브쿼리문을 커서라는 메모리 공간에 넣어놓는다고 생각
DECLARE
CURSOR 커서명 IS SQL문(서브쿼리)
BEGIN
OPEN 커서명;
FETCH 커서명 INTO 변수명; -- 커서의 데이터를 변수에 할당
CLOSE 커서명;
END;
- 여러행 조회하기(일반 LOOP문)
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
CURSOR c IS -- 커서 선언
SELECT empno, ename
FROM emp;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_empno, v_ename; -- 커서와 변수의 갯수가 맞아야함
EXIT WHEN c%notfound; -- 커서가 돌다가 NULL값을 만나면 exit
dbms_output.put_line(v_empno || ' ' || v_ename);
END loop;
CLOSE c;
END;
★ 여러행 조회하기(FOR LOOP문) -> OPEN, FETCH, CLOSE 생략
- FOR 변수명 IN 커서명 LOOP
DECLARE
CURSOR c IS -- 커서 선언
SELECT empno, ename
FROM emp;
BEGIN
FOR emp_rec IN c loop -- 커서의 데이터를 저장할 emp_rec 변수 선언, 일반 LOOP문과 다르게 갯수 맞출필요 X
dbms_output.put_line(emp_rec.empno || ' ' || emp_rec.ename);
END loop;
END;
-- 입력 받기 (&연산자 사용) --
DECLARE
CURSOR c IS -- 커서 선언
SELECT empno, ename
FROM emp
WHERE ename = '&ename';
BEGIN
FOR emp_rec IN c loop -- 커서의 데이터를 저장할 emp_rec 변수 선언
dbms_output.put_line(emp_rec.empno || ' ' || emp_rec.ename);
END loop;
END;
-- 파라미터 --
DECLARE
CURSOR c(p_name emp.ename%type) IS -- 커서 선언
SELECT empno, ename
FROM emp
WHERE ename = p_name;
BEGIN
FOR emp_rec IN c('SCOTT') loop -- 커서의 데이터를 저장할 emp_rec 변수 선언
dbms_output.put_line(emp_rec.empno || ' ' || emp_rec.ename);
END loop;
END;
● 묵시적 커서 : 오라클에서 자동으로 선언, 사용자개입 X, 저장되는 데이터는 한개의 행만 가능
- SQL%NOTFOUND : 추출한 행이 없을 때 true
- SQL%FOUND : 추출한 행이 있을 때 true
- SQL%ROWCOUNT : 추출한 행의 갯수
CREATE OR REPLACE PROCEDURE emp4_del(
v_empno emp4.empno%TYPE)
IS
BEGIN
DELETE FROM emp4 WHERE empno = v_empno;
IF (SQL%notfound) THEN -- 추출한 행이 없을때
dbms_output.put_line(v_empno || ' 사번이 없습니다.');
ELSE
dbms_output.put_line(v_empno || ' 삭제 되었습니다.');
END IF;
END;