본문 바로가기

데이터베이스/PL/SQL

PL/SQL : Cursor


오라클은 작업 영역을 사용하여 SQL 문을 실행하고 처리 정보를 저장합니다.

커서 Cursor 라는 PL/SQL 구성을 사용하여 작업 영역의 이름을 지정하고 저장된 정보에 엑세스 할 수 있으며,

암시적 커서와 명시적 커서가 있습니다.

PL/SQL은 하나의 행만 반환
하는 질의를 포함하여 모든 SQL 데이터 조작문에 대해 커서를 암시적으로 선언하고

하나 이상의 행을 반환하는 질의에는

다음 예와 같이 개별적으로 행을 처리할 커서를 명시적으로 선언할 수 있습니다.


DECLARE
CURSOR c1 IS
SELECT empno, ename, job FROM emp WHERE deptno = 20;
복수 행 질의에 의해 반환된 행 집합을 결과 집합이라고 합니다.

명시적 커서는 결과 집합의 현재 행을
“가리키므로”프로그램이 한번에 한 행씩 처리할 수 있습니다.

<결과 집합>

 1  f  c  d
 2  a d  d
 3  a  c c
 4  b  c  d
 3  현재행의 처리

OPEN, FETCH, CLOSE문을 사용하여 커서를 제어합니다.

OPEN 문은 커서와 연관된 질의를 실행하여 결과 집합을 식별하고 첫 번째 행 앞에 커서를 놓습니다.

FETCH 문은 현재 행을 읽어 들인 후 다음 행으로 커서를 보냅니다.

CLOSE 문은 마지막 행 처리가 끝나면 커서를 사용할 수 없도록 합니다.


Cursor FOR Loop

커서 F O R 루프는 루프 인덱스를 데이터베이스에서 인출된 행을 나타내는 레코드로 암시적으로 선언한 다음
커서를 열고

결과 집합에서 행 값을 레코드 필드로 반복하여 인출한 후

모든 행이 처리되면 커서를 닫습니다.

DECLARE
CURSOR c1 IS
SELECT ename, sal, hiredate, deptno FROM emp;
...
BEGIN
FOR emp_rec IN c1 LOOP
...
salary_total := salary_total + emp_rec.sal;
END LOOP;


레코드의 각 필드를 참조하려면 구성 요소선택자 역할을 하는 점( . ), 점 표기법을 사용합니다.


커서 변수
커서 변수는 커서와 마찬가지로 복수 행 질의의 결과 집합에서 현재 행을 가리키지만,
커서와 달리 특정 질의와 결합되지 않고 임의의 유형과 호환 가능한 질의에 대해 열릴
수 있습니다. 커서 변수는 새로운 값을 할당하고 오라클 데이터베이스에 저장된 하위
프로그램에 전달할 수 있다는 점에서 전형적인 PL/SQL 변수로 데이터 검색을 중앙 집
중화할 수 있는 융통성 있고 편리한 방법을 제공합니다.
일반적으로 커서 변수를 형식 매개변수 중 하나로 선언한 내장 프로시저로 전달하여
커서 변수를 엽니다. 다음 프로시저는 선택된 질의에 대해 커서 변수 g e n e r i c _ c v를
엽니다.

PROCEDURE open_cv (generic_cv IN OUT GenericCurTyp,choice NUMBER) IS
BEGIN
IF choice = 1 THEN
OPEN generic_cv FOR SELECT * FROM emp;
ELSIF choice = 2 THEN
OPEN generic_cv FOR SELECT * FROM dept;
ELSIF choice = 3 THEN
OPEN generic_cv FOR SELECT * FROM salgrade;
END IF;