지금까지 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

+ Recent posts