▣ 커서(Cursor)란??
▷ 쿼리문에 의해서 반환되는 결과값들을 저장하는 메모리공간
* Fetch : 커서에서 원하는 결과값을 추출하는 것
▣ 커서의 종류
▷ 명시적(Explicit) 커서 : 사용자가 선언해서 생성 후 사용하는 SQL 커서, 주로 여러개의 행을 처리하고자 할 경우 사용.
▷ 묵시적(Implicit) 커서 : 오라클에서 자동으로 선언해주는 SQL 커서. 사용자는 생성 유무를 알 수 없다.
▣ 커서의 속성
※ 커서를 open하고 나서 fetch가 발생하면 true 값을 반환
▷ %FOUND - 할당할 레코드가 있는 경우 true값을 반환.
▷ %isOpen - 커서가 오픈상태일 경우 true값을 반환.
▷ %NotFound - 할당할 레코드가 없는 경우 true값을 반환.
▷ %RowCount - 카운터 역할을 한다. 커서가 오픈됐을 경우 0, 패치가 발생할 때 마다 1씩 증가.
▣ 커서의 처리단계(명시적 커서)
1. 명시적 커서 선언 → Cursor 커서이름
2. 명시적 커서 오픈 → Open 커서이름
3. 커서에서 데이터 추출 → Fetch 커서이름
4. 커서 종료 → Close 커서이름
사용 예시)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Declare emp_id number(4); emp_name varchar2(10); emp_salary number(10); Cursor cu1 is select empno, ename, sal from emptest1 where deptno = 30; begin open cu1; dbms_output.put_line('사번 이름 급여'); loop fetch cu1 into emp_id, emp_name, emp_salary; --fetch 커서에서 값을 꺼내오는 것 exit when cu1%NotFound; --커서에 있는 데이터를 fatch하여 넣어주는데 --더이상 변수에 할당할 레코드가 없을 때 빠져나간다 dbms_output.put_line(emp_id||' '||emp_name||' '||emp_salary); end loop; close cu1; end; / | cs |
1) Declare(선언부)에서 변수 선언 및 커서 선언
Cursor cu1 is --커서 cu1 선언
select empno, ename, sal
from emptest1
where deptno = 30; -- emptest1 테이블에서 deptno가 30인 데이터중
empno, ename, sal 을뽑아 cu1에 넣어줌
2) begin
open cu1; --커서를 오픈
loop --loop 시작
fetch cu1 into emp_id, emp_name, emp_salary; --fetch작업. 커서에서 값을 꺼내옴
exit when cu1%NotFound; --커서에 있는 데이터를 fetch하여 넣어주는데
--더이상 변수에 할당할 레코드가 없으면 빠져나간다.
end loop; --loop 종료
close cu1; --커서 닫기
3) end;
4) /
▣ 커서와 반복문(For문)
▷ 사용 형식
FOR 레코드 네임 IN 커서이름 LOOP
명시적 커서의 OPEN, FETCH가 자동으로 수행
실행 문장들
END LOOP; 루프문을 빠져나갈 때 자동적으로 커서가 종료된다.
사용예시)
1 2 3 4 5 6 7 8 9 10 11 12 | DECLARE -- 레코드 사용 cursor emp_cur is select empno, ename from emptest1; begin for emp_rec in emp_cur loop dbms_output.put_line(emp_rec.empno||' '||emp_rec.ename); end loop; end; / | cs |
1) DECLARE(선언문) 에서 커서를 선언해준다
2) BEGIN FOR문을 이용해 반복시킨다
3) END;
4) /
▣ 묵시적 커서 사용
▷ 속성 사용 시 SQL%NotFound, SQL%rowcount, SQL%Found, SQL%inOpen과 같이 SQL을 넣어 사용
사용예시)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | declare cnt1 number; cnt2 number; begin select count(*) into cnt1 --count값은 커서에 있는 것인데 그 값을 추출할 때 fetch발생 from emp where deptno = 30; cnt2 := sql%rowcount; --묵시적 커서 dbms_output.put_line('cnt1의 값 : ' || cnt1); dbms_output.put_line('cnt2의 값 : ' || cnt2); end; / | cs |
1) DECLARE 에서 커서 선언
2) BEGIN 에서 cnt2 묵시적 커서로, 속성사용하기위해 SQL사용
3) END;
4) /
5) 출력결과로 deptno 가 30인 인원이 6명이기에 cnt1의 값은 6이 나오고
count를 추출할 때 fetch가 한번 발생했기 때문에 cnt2의 값은 1이 나옴.
'Programming > DataBase' 카테고리의 다른 글
(SQL)프로시저와 함수의 모임 패키지에 대해 알아봅시다 (0) | 2018.04.24 |
---|---|
(SQL) 서브프로그램 및 프로시저에 대해 알아보자! (0) | 2018.04.23 |
(SQL) 바인드변수란 무엇일까? (0) | 2018.04.23 |
(SQL) 복합변수가 무엇일까? (1) | 2018.04.23 |
(SQL) PL/SQL 기본적인 변수에 대하여 알아보자 (0) | 2018.04.23 |