[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;
오라클에서는 다양한 커서의 속성을 통해 커서의 상태를 알려주는데 이 속성을 이용해서 커서를 제어해야 합니다.
커서의 생성과 이용
- 부서 테이블의 부서 정보를 커서를 이용해서 한 행씩 가져와 출력
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();
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();