○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;

 

'DB > Oracle' 카테고리의 다른 글

Orecle과 Mysql의 차이점  (0) 2020.09.06
패키지  (0) 2020.07.09
사용자 정의 함수  (0) 2020.07.04
트리거  (0) 2020.07.04
프로시저  (0) 2020.07.04

+ Recent posts