커서에서 행 페치(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
- 대상 배열에 저장되는 행 수의 한계를 식별합니다. 커서 위치는 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;
