[Oracle] 37.커서


커서



앞선 PL/SQL 예제에서는 처리 결과가 1개의 행인 SELECT 문만을 다루었습니다.

하지만 대부분의 SELECT 문은 수행 후 반환되는 행의 개수가 한 개 이상입니다!

처리 결과가 여러 개의 행으로 구해지는 SELECT 문을 처리하려면 지금부터 학습할 커서를 이용해야 합니다~


커서의 구조는 다음과 같습니다.


DECLARE
	-- 커서 선언
	CURSOR cursor_name  IS select_statement;
BEGIN
	-- 커서 열기
	OPEN cursor_name;
	--커서로부터 데이터를 읽어와 변수에 저장
	FECTCH cur_name  INTO variable_name;
	--커서 닫기
	CLOSE cursor_name;
END;



오라클에서는 다양한 커서의 속성을 통해 커서의 상태를 알려주는데 이 속성을 이용해서 커서를 제어해야 합니다.


image



커서의 생성과 이용




  • 부서 테이블의 부서 정보를 커서를 이용해서 한 행씩 가져와 출력




CREATE OR REPLACE PROCEDURE CURSOR_EX
IS
    --커서 선언
    CURSOR C1 IS SELECT department_id,department_name,location_id from departments;
    vdept departments%ROWTYPE;
BEGIN
    DBMS_OUTPUT.PUT_LINE('부서번호/부서명/지역번호');
    DBMS_OUTPUT.PUT_LINE('=====================');
    --커서 OPEN
    OPEN C1;
    LOOP
        -- 커서 FETCH
        FETCH C1 INTO vdept.department_id,vdept.department_name,vdept.location_id;
        --더 이상 행이 없으면 루프를 빠져나감
        EXIT WHEN C1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(vdept.department_id||'/'||vdept.department_name||'/'||vdept.location_id);
    END LOOP;
    --커서 CLOSE
    CLOSE C1;
END;
/




EXEC CURSOR_EX();




image




CURSOR와 FOR LOOP



CURSOR FOR LOOP는 명시적 CURSOR에서 행을 처리합니다.

LOOP에서 각 반복마다 CURSOR를 열고 행을 인출(FETCH)하고 모든 행이 처리되면 자동으로 CURSOR가 CLOSE되므로 사용하기가 편리합니다.

CURSOR FOR LOOP의 구조는 다음과 같습니다.


FOR record_name IN cursor_name LOOP
	statement1;
	statement2;
	. . . . . .
END LOOP




그럼 CURSOR FOR LOOP를 이용해서 위의 예제를 다시 한 번 해볼까요?


CREATE OR REPLACE PROCEDURE CURSOR_EX2
IS
    --커서 선언
    CURSOR C1 IS SELECT department_id,department_name,location_id from departments;
    vdept departments%ROWTYPE;
BEGIN
    DBMS_OUTPUT.PUT_LINE('부서번호/부서명/지역번호');
    DBMS_OUTPUT.PUT_LINE('=====================');
   
   --CURSOR FOR LOOP
    FOR vdept IN C1 LOOP
        --더 이상 행이 없으면 루프를 빠져나감
        EXIT WHEN C1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(vdept.department_id||'/'||vdept.department_name||'/'||vdept.location_id);
    END LOOP;
END;
/




EXEC CURSOR_EX2();



실행 결과는 같습니다!