カーソルからの行のフェッチ (PL/SQL)

PL/SQL カーソルから行をフェッチするのに必要な FETCH ステートメントが、PL/SQL コンテキスト内で データ・サーバーによってサポートされています。

構文

構文図を読む構文図をスキップするFETCHcursor-nameINTOrecord,variablebulk-collect-clause
bulk-collect-clause
構文図を読む構文図をスキップするBULK COLLECT INTO ,array-variable LIMITinteger-constant

説明

cursor-name
静的カーソルまたはカーソル変数の名前。
record
既に定義されているレコードの ID。 これは、ユーザー定義のレコードでも、%ROWTYPE 属性を使用して表から得られたレコード定義でも構いません。
variable
フェッチされた行からのフィールド・データを保持する PL/SQL 変数。 変数は 1 つ以上定義できますが、順序および数において、カーソル宣言内で指定した照会の選択リストに返されるフィールドと一致している必要があります。 選択リスト内の各フィールドのデータ・タイプは、レコード内の各フィールドのデータ・タイプ、または各変数のデータ・タイプと一致しているか、あるいはそれらに暗黙的に変換可能でなければなりません。

変数データ・タイプを、明示的に、または %TYPE 属性を使用して定義できます。

BULK COLLECT INTO array-variable
1 つ以上の変数を 1 つの配列データ・タイプとみなします。 添字を順に割り当てながら、結果セットの順序でそれぞれの配列の 1 つの要素へ結果の各行を割り当てます。
  • 1 つの array-variable のみを指定した場合。
    • array-variable エレメントのデータ・タイプがレコード・タイプではない場合、カーソルの結果行には必ず 1 つの列が必要となり、列データ・タイプは配列エレメントのデータ・タイプに割り当て可能でなければなりません。
    • 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;