커서에서 행 페치(PL/SQL)

PL/SQL 커서에서 행을 가져오는 데 필요한 FETCH문이 PL/SQL 컨텍스트에서 데이터 서버에 의해 지원됩니다.

구문

구문 도표 읽기시각적 구문 도표 생략
>>-FETCH--cursor-name--+-INTO--+-record-------+--+-------------><
                       |       | .-,--------. |  |   
                       |       | V          | |  |   
                       |       '---variable-+-'  |   
                       '-| bulk-collect-clause |-'   

bulk-collect-clause

                      .-,--------------.   
                      V                |   
|--BULK COLLECT INTO----array-variable-+------------------------>

>--+-------------------------+----------------------------------|
   '-LIMIT--integer-constant-'   

설명

cursor-name
정적 커서 또는 커서 변수의 이름입니다.
record
이전에 정의된 레코드의 ID입니다. 이는 %ROWTYPE 속성을 사용하여 테이블에서 파생된 레코드 정의이거나 사용자 정의 레코드일 수 있습니다.
variable
페치된 행의 필드 데이터를 보유하는 PL/SQL 변수입니다. 하나 이상의 변수를 정의할 수 있지만, 커서 선언에 지정된 쿼리의 선택 목록에서 리턴되는 필드와 순서 및 수가 일치해야 합니다. 선택 목록에 있는 필드의 데이터 유형은 변수의 데이터 유형 또는 레코드에 있는 필드의 데이터 유형과 일치하거나 내재적으로 이러한 유형으로 변환 가능해야 합니다.

변수 데이터 유형은 %TYPE 속성을 사용하여 또는 명시적으로 정의할 수 있습니다.

BULK COLLECT INTO array-variable
하나 이상의 변수를 하나의 배열 데이터 유형으로 식별합니다. 결과의 각 행은 결과 세트의 순서대로 각 배열의 요소에 지정되며, 이때 배열 인덱스가 순서대로 지정됩니다.
  • 정확히 하나의 array-variable을 지정한 경우:
    • array-variable 요소의 데이터 유형이 레코드 유형이 아닌 경우, 커서의 결과 행은 하나의 컬럼만 보유해야 하며 컬럼 데이터 유형은 배열 요소 데이터 유형에 지정 가능해야 합니다.
    • array-variable 요소의 데이터 유형이 레코드 유형이면 커서의 결과 행은 레코드 유형에 지정 가능해야 합니다.
  • 다중 배열 변수를 지정한 경우:
    • array-variable 요소의 데이터 유형은 레코드 유형이 아니어야 합니다.
    • 커서의 결과 행에 있는 컬럼마다 array-variable이 있어야 합니다.
    • 커서의 결과 행에 있는 각 컬럼의 데이터 유형은 대응하는 array-variable의 배열 요소 데이터 유형에 지정할 수 있어야 합니다.
array-variable의 데이터 유형이 일반 배열인 경우, 최대 카디널리티는 쿼리에서 리턴하는 행 수 이상이거나 LIMIT절에 지정된 integer-constant 이상이어야 합니다.
LIMIT integer-constant
대상 배열에 저장되는 행 수의 한계를 식별합니다. 커서 위치는 integer-constant행 앞으로 또는 결과 세트의 끝으로 이동합니다.

다음 예는 FETCH문을 포함하는 프로시저를 표시합니다.
CREATE OR REPLACE PROCEDURE cursor_example
IS
    v_empno         NUMBER(4);
    v_ename         VARCHAR2(10);
    CURSOR emp_cur_3 IS SELECT empno, ename FROM emp WHERE deptno = 10
        ORDER BY empno;
BEGIN
    OPEN emp_cur_3;
    FETCH emp_cur_3 INTO v_empno, v_ename;
        ...
END;
%TYPE 속성을 사용하여 대상 변수의 데이터 유형을 정의하는 경우, 데이터베이스 컬럼의 데이터 유형이 변경되더라도 PL/SQL 애플리케이션 프로그램의 대상 변수 선언을 변경할 필요가 없습니다. 다음 예는 %TYPE 속성을 사용하여 정의된 변수를 포함하는 프로시저를 표시합니다.
CREATE OR REPLACE PROCEDURE cursor_example
IS
    v_empno         emp.empno%TYPE;
    v_ename         emp.ename%TYPE;
    CURSOR emp_cur_3 IS SELECT empno, ename FROM emp WHERE deptno = 10
        ORDER BY empno;
BEGIN
    OPEN emp_cur_3;
    FETCH emp_cur_3 INTO v_empno, v_ename;
        ...
END;
테이블의 모든 컬럼을 정의된 순서대로 검색하는 경우 %ROWTYPE 속성을 사용하여 FETCH문이 검색된 데이터를 배치하는 레코드를 정의할 수 있습니다. 그런 다음, 점 표기법을 사용하여 레코드 내의 각 필드에 액세스할 수 있습니다. 다음 예는 %ROWTYPE을 사용하는 레코드 정의를 포함하는 프로시저를 표시합니다. 이 레코드는 FETCH문의 대상으로 사용됩니다.
CREATE OR REPLACE PROCEDURE cursor_example 
IS
     v_emp_rec       emp%ROWTYPE;
     CURSOR emp_cur_1 IS SELECT * FROM emp; 
BEGIN     
     OPEN emp_cur_1;
     FETCH emp_cur_1 INTO v_emp_rec;
     DBMS_OUTPUT.PUT_LINE('Employee Number: ' || v_emp_rec.empno);
     DBMS_OUTPUT.PUT_LINE('Employee Name  : ' || v_emp_rec.ename);
END;