지금까지 PL / SQL을 학습하면서 하나의 데이터를 처리했지만,
커서는 두 개 이상의 데이터를 처리할 수 있다.
형식:
DECLARE -- 커서 선언
CURSOR 커서이름IS 실행문; -- 보통 select SQL문이 실행문에 들어간다.
BEGIN -- 커서 열기
OPEN 커서이름;
FETCH 커서이름 INTO 바인드변수;
CLOSE 커서이름; --커서닫기
END;
/
OPEN
FETCH
이것만 봐선 무슨 소린지 모르겠다..
예제를 통해서 살펴보아야 겠다.
부서 테이블의 모든 데이터를 출력하기 위한 PL/SQL문 작성
1) 저장 프로시저를 생성한다.
set SERVEROUTPUT ON
create or replace procedure cursor_sample01
is
vdept dept%rowtype;
cursor c1 is
select * from dept;
BEGIN
dbms_output.put_line('부서번호 / 부서명 / 지역명');
dbms_output.put_line('------------------------');
OPEN c1;
LOOP
FETCH c1 into vdept.deptno, vdept.dname, vdept.loc; -- 인출
exit when c1%notfound; -- 커서가 가져올 데이터가 없을 때 TRUE
dbms_output.put_line(vdept.deptno || ' / ' || vdept.dname || ' / ' || vdept.loc);
END LOOP;
CLOSE c1;
END;
/
2) 프로시저 실행.
매개변수가 없으므로 프로시저 명만 입력해도 잘 실행된다.
execute cursor_sample01;
3) 출력한다.
여전히 잘 모르겠지만 일반 loop문 대신 for loop 문으로 같은 내용을 출력해보는 실습을 했다.
for loop문의 장점은 OPEN ~ FETCH ~ CLOSE 없이 보다 간결하게 SQL문을 작성할 수 있다는 점인데,
각 반복문마다 커서를 열고, 각 행을 인출 fetch 하고, close로 커서를 닫는 작업을 자동으로 처리해준다.
set SERVEROUTPUT ON
create or replace procedure cursor_sample02
is
dept dept%rowtype;
cursor c1
is
select*from dept;
BEGIN
dbms_output.put_line('부서번호 / 부서명 / 지역명');
dbms_output.put_line('------------------------');
FOR vdept IN c1 LOOP
EXIT WHEN c1%notfound;
dbms_output.put_line(vdept.deptno || ' / ' || vdept.dname || ' / ' || vdept.loc);
END LOOP;
END;
/
'오라클 데이터베이스' 카테고리의 다른 글
트리거 (0) | 2022.08.02 |
---|---|
패키지 (0) | 2022.08.02 |
저장 함수 (0) | 2022.08.02 |
저장 프로시저 - 매개변수의 IN, OUT, INOUT (0) | 2022.08.01 |
저장 프로시저 - 기본형태, 매개변수 (0) | 2022.08.01 |