커서?
select문 또는 조작어 같은 sql문을 실행했을 때 해당 sql문을 처리하는 정보를 저장한 메모리 공간
<명시적 커서>
사용자가 직접 커서를 선언하여 사용
declare
cursor 커서이름 is sql문; -- 커서 선언(declaration)
begin
open 커서이름; -- 커서 열기(open)
fetch 커서이름 into 변수 --커서로부터 읽어온 데이터 사용(fetch)
close 커서이름; -- 커서 닫기(close)
end;
- set into
set serveroutput on;
declare
v_dept_row dept%rowtype;
begin
select deptno, dname, loc into v_dept_row
from dept
where deptno = 40;
dbms_output.put_line('deptno: ' || v_dept_row.deptno);
end;
/
- 하나의 행만 조회되는 경우
declare
v_dept_row dept%rowtype;
cursor c1 is
select deptno, dname, loc
from dept
where deptno = 40;
begin
open c1;
fetch c1 into v_dept_row;
dbms_output.put_line('deptno: ' || v_dept_row.deptno);
close c1;
end;
/
- 여러행이 조회되는 경우(LOOP문 사용)
declare
v_dept_row dept%rowtype;
cursor c1 is
select deptno, dname, loc
from dept;
begin
open c1;
loop
fetch c1 into v_dept_row;
exit when c1%notfound;
dbms_output.put_line('deptno: ' || v_dept_row.deptno);
end loop;
close c1;
end;
**%NOTFOUND : FETCH문을 통해 더이상 추출한 데이터가 없을 경우 LOOP 종료
- for loop 문 활용
open, fetch, close문 생략
커서 각 행을 c1_rec 루프 인덱스에 저장하므로 결과 행을 저장하는 변수 선언도 필요하지 않음
declare
cursor c1 is
select deptno, dname, loc
from dept;
begin
for c1_rec in c1 loop
dbms_output.put_line('deptno: ' || c1_rec.deptno);
end loop;
end;
/
- 파라미터 활용
고정값이 아닌 직접 입력한 값 또는 상황에 따라 여러 값을 번갈아 사용할 경우
declare
v_dept_row dept%rowtype;
cursor c1(p_deptno dept.deptno%type) is
select deptno, dname, loc
from dept
where deptno = p_deptno;
begin
open c1(10);
loop
fetch c1 into v_dept_row;
exit when c1%notfound;
dbms_output.put_lint('10번 부서 - deptno : ' || v_dept_row.deptno);
end loop;
close c1;
open c1(20);
loop
fetch c1 into v_dept_row;
exit when c1%notfound;
dbms_output.put_lint('20번 부서 - deptno : ' || v_dept_row.deptno);
end loop;
close c1;
end;
/
속성 | 설명 |
커서명%NOTFOUND | 수행된 FATCH문을 통해 추출된행 있으면 FALSE 없으면 TRUE반환 |
커서명%FOUND | 수행된 FATCH문을 통해 추출된행 있으면 TURE없으면 false반환 |
커서명%ROWCOUNT | 현재까지 추출된 행 수 |
커서명%ISOPEN | 커서가 열려있으면 (OPEN) TRUE, 닫혀 있으면 FALSE 반환 |
<묵시적 커서>
별다른 선언없이 sql문을 사용했을 때 오라클에서 자동으로 선언되는 커서
사용자가 open, fetch, close등 지정하지 않고 pl/sql 내부에서 dml명령 또는 select into 문 등이 실행될 때 자동으로 생성 및 리
명시적 커서와 동일하게 속성을 사용할 수 있다.
-> SQL%NOTFOUND...
'oracle' 카테고리의 다른 글
패키지 (0) | 2022.11.03 |
---|---|
저장 함수 (0) | 2022.11.03 |
1021_데이터 사전 (0) | 2022.10.31 |
1027_저장 프로시저 (0) | 2022.10.30 |
1026_PL/SQL(변수, 조건문, 반복문) (0) | 2022.10.27 |