Oracle PL/SQL Cursor:Implicit,Explicit,Cursor FOR Loop[例]
PL/SQLのCURSORとは何ですか?
カーソルはこのコンテキスト領域へのポインタです。 Oracleを作成し地域の文脈処理するSQL文を含むすべての情報についてです。
PL/SQLを使用すると、プログラマはカーソルを介してコンテキスト領域を制御できます。 カーソルには、SQL文によって返された行が保持されます。 カーソルが保持する行のセットはアクティブセットと呼ばれます。, これらのカーソルには、コードの別の場所から参照できるように名前を付けることもできます。
このチュートリアルでは、次のことを学びます-
- 暗黙のカーソル
- 明示的なカーソル
- カーソル属性
- FOR Loop Cursor statement
カーソルは二つのタイプです。
- Implicit Cursor
- Explicit Cursor
Implicit Cursor
データベースでDML操作が発生するたびに、その特定の操作で影響を受ける行を保持する暗黙のカーソルが作成されます。, これらのカーソルには名前を付けることはできず、コードの別の場所から制御または参照することはできません。 Cursor属性を通じて、最新のcursorのみを参照できます。
明示的なカーソル
プログラマは、名前付きコンテキスト領域を作成してDML操作を実行し、それをより詳細に制御することができます。 明示的なカーソルは、PL/SQLブロックの宣言セクションで定義する必要があり、コードで使用する必要がある’SELECT’文用に作成されます。
以下は、明示的なカーソルの操作に関連する手順です。,
- カーソルを宣言する
カーソルを宣言することは、単に宣言部分で定義されている’SELECT’ステートメントの名前付きコンテキスト領域を作成することを このコンテキスト領域の名前は、カーソル名と同じです。
- カーソルを開く
カーソルを開くと、このカーソルにメモリーを割り当てるようにPL/SQLに指示します。 カーソルがレコードをフェッチする準備が整います。
- カーソルからデータを取得する
このプロセスでは、’SELECT’文が実行され、取得された行が割り当てられたメモリに格納されます。, これらはアクティブセットと呼ばれます。 カーソルからデータを取得することは、レコード単位でデータにアクセスできることを意味するレコードレベルのアクティビティです。
各fetch文は一つのアクティブセットをフェッチし、その特定のレコードの情報を保持します。 この文は、レコードを取得し、’INTO’句の変数に割り当てる’SELECT’文と同じですが、例外はスローされません。
- カーソルを閉じる
すべてのレコードがフェッチされたら、このコンテキスト領域に割り当てられたメモリが解放されるようにカーソルを閉じる必要があります。,
構文:
- 上記の構文では、宣言部分にはカーソルの宣言と、フェッチされたデータが割り当てられるカーソル変数が含まれています。
- カーソルは、カーソル宣言で指定された’SELECT’ステートメント用に作成されます。
- 実行部分では、宣言されたカーソルが開かれ、フェッチされ、閉じられます。
カーソル属性
暗黙的カーソルと明示的カーソルの両方に、アクセスできる特定の属性があります。 これらの属性は、カーソル操作に関する詳細情報を提供します。, 以下は、異なるカーソル属性とその使用法です。
カーソル属性 | 説明 |
%FOUND | 最新のフェッチ操作がレコードを正常にフェッチした場合、ブール値の結果’TRUE’を返し、それ以外の場合はFALSEを返します。 |
%NOTFOUND | これは、最新のフェッチ操作がレコードをフェッチできなかった場合、’TRUE’を返します%FOUNDとは反対に機能します。, |
%ISOPEN | 指定されたカーソルがすでに開かれている場合はブール値の結果’TRUE’を返し、そうでない場合は’FALSE’を返します |
%ROWCOUNT | 数値を返します。 これは、DMLアクティビティの影響を受けたレコードの実際の数を示します。 |
例1:この例では、明示的なカーソルを宣言、オープン、フェッチ、および閉じる方法を見ていきます。
カーソルを使用してempテーブルからすべての従業員の名前を投影します。, また、cursor属性を使用して、カーソルからすべてのレコードを取得するループを設定します。
Output
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY Total rows fetched is 3
コード説明:
- コード行2:ステートメント’SELECT emp_name FROM emp’のカーソルguru99_detを宣言します。
- コードライン3:変数lv_emp_nameを宣言します。
- コードライン5:カーソルguru99_detを開きます。
- コード行6:’emp’テーブル内のすべてのレコードをフェッチするための基本的なloopステートメントの設定。,
- コードライン7:guru99_detデータをフェッチし、値をlv_emp_nameに割り当てます。
- コードライン9:カーソル属性’%NOTFOUND’を使用して、カーソル内のすべてのレコードがフェッチされているかどうかを調べます。 フェッチされた場合、’TRUE’を返し、コントロールはループから終了し、そうでない場合、コントロールはカーソルからデータをフェッチし続け、データを出力します。
- コードライン11:loopステートメントの終了条件。
- コード行12:取得した従業員名を出力します。,
- コード行14:カーソル属性’%ROWCOUNT’を使用して、カーソル内で影響を受けた/フェッチされたレコードの総数を検索します。
- コードライン15:ループから終了した後、カーソルは閉じられ、割り当てられたメモリは空きに設定されます。
FORループカーソルステートメント
“FORループ”ステートメントは、カーソルを操作するために使用することができます。 ループがカーソルの最初のレコードからカーソルの最後のレコードまで機能するように、FOR loopステートメントでrange limitの代わりにカーソル名を指定できます。, カーソル変数、カーソルの開き、カーソルのフェッチと閉じは、FORループによって暗黙的に行われます。
構文:
DECLARECURSOR <cursor_name> IS <SELECT statement>;BEGIN FOR I IN <cursor_name> LOOP . . END LOOP;END;
- 上記の構文では、宣言部分にはカーソルの宣言が含まれています。
- カーソルは、カーソル宣言で指定された’SELECT’ステートメント用に作成されます。
- 実行部分では、宣言されたカーソルがFORループで設定され、ループ変数’I’はこの場合カーソル変数として動作します。,
例1:この例では、cursor-FORループを使用してemp表からすべての従業員名を投影します。
Output
Employee Fetched:BBB Employee Fetched:XXXEmployee Fetched:YYY
コード説明:
- コード行2:ステートメント’SELECT emp_name FROM emp’のカーソルguru99_detを宣言します。
- コードライン4:ループ変数lv_emp_nameを使用してカーソルの’FOR’ループを構築します。
- コードライン5:ループの各反復で従業員名を印刷します。,
- コードライン8:ループを終了します
注:Cursor-FORループでは、カーソルのオープン、フェッチ、およびクローズはFORループによって暗黙的に行われるため、cursor属性は使用できません。