カーソルは明示的または暗黙的にすることができ、どちらのタイプもFORループで使用できます。質問には2つの側面があります。
暗黙的なカーソルFORループではなく明示的なカーソルFORループを使用する理由
- クエリを再利用する場合は、明示的なカーソルのFORループを使用します。そうでない場合は、暗黙のカーソルが優先されます。
明示的なFETCHのないFORループではなく、FETCHを使用したループを使用するのはなぜですか?
- 一括収集が必要な場合、または動的SQLが必要な場合は、ループ内でFETCHを使用します。
ドキュメントから役立つ情報をいくつか紹介します。
LOOPの暗黙カーソルの例
BEGIN
FOR vItems IN (
SELECT last_name
FROM employees
WHERE manager_id > 120
ORDER BY last_name
)
LOOP
DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
END LOOP;
END;
/
LOOPの明示的なカーソルの例
DECLARE
CURSOR c1 IS
SELECT last_name
FROM employees
WHERE manager_id > 120
ORDER BY last_name;
BEGIN
FOR vItems IN c1 LOOP
DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
END LOOP;
END;
/
暗黙カーソル
暗黙カーソルは、PL / SQLによって構築および管理されるセッションカーソルです。PL / SQLは、SELECTまたはDMLステートメントを実行するたびに暗黙カーソルを開きます。暗黙カーソルを制御することはできませんが、その属性から情報を取得できます。
暗黙的なカーソルは、関連するステートメントが実行された後に閉じます。ただし、その属性値は、別のSELECTまたはDMLステートメントが実行されるまで利用可能です。
暗黙的なカーソル属性は、SQL%ISOPEN、SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT、SQL%BULK_ROWCOUNT、SQL%BULK_EXCEPTIONSです。
明示的なカーソル
明示カーソルは、ユーザーが作成および管理するセッションカーソルです。明示的なカーソルを宣言して定義し、名前を付けてクエリに関連付ける必要があります(通常、クエリは複数の行を返します)。次に、次のいずれかの方法でクエリ結果セットを処理できます。
(OPENステートメントを使用して)明示的なカーソルを開き、(FETCHステートメントを使用して)結果セットから行をフェッチし、(CLOSEステートメントを使用して)明示的なカーソルを閉じます。
カーソルFOR LOOPステートメントで明示的なカーソルを使用します(「カーソルFOR LOOPステートメントを使用したクエリ結果セット処理」を参照)。
明示的なカーソルに値を割り当てたり、式で使用したり、仮のサブプログラムパラメータまたはホスト変数として使用したりすることはできません。カーソル変数を使用してこれらのことを実行できます(「カーソル変数」を参照)。
暗黙カーソルとは異なり、明示カーソルまたはカーソル変数をその名前で参照できます。したがって、明示的なカーソルまたはカーソル変数は、名前付きカーソルと呼ばれます。
カーソルFOR LOOPステートメント
カーソルのFOR LOOPステートメントを使用すると、SELECTステートメントを実行し、結果セットの行をすぐにループできます。このステートメントでは、暗黙的または明示的なカーソルを使用できます。
FOR
カーソルを使用するもう1つの方法です。次のドキュメントを参照してください:docs.oracle.com/cd/E11882_01/appdev.112/e10472/… とにかく、htp.prn()は何をしますか?