본문 바로가기
oracle

커서

by 신방동불주먹 2022. 11. 2.

커서?

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