要約:このチュートリアルでは、PL / SQLカーソルとその使用法について学習します。
カーソルはクエリの結果を指すポインタ。 PL / SQLには、暗黙カーソルと明示カーソルの2種類のカーソルがあります。
暗黙カーソル
OracleがSELECT INTO
、INSERT
、UPDATE
、およびDELETE
の場合、暗黙カーソルが自動的に作成されます。
Oracleは、暗黙カーソルの実行サイクル全体を内部的に管理し、SQL%ROWCOUNT
、SQL%ISOPEN
、SQL%FOUND
、およびSQL%NOTFOUND
。
クエリが0行または複数行を返す場合、暗黙カーソルはエレガントではありません。これにより、それぞれNO_DATA_FOUND
またはTOO_MANY_ROWS
例外が発生します。
明示カーソル
明示カーソルは現在のブロックまたはパッケージ仕様の宣言セクションで明示的に宣言されたSELECT
ステートメント。
明示カーソルの場合、続きがあります。 OPEN
、FETCH
、およびCLOSE
から実行サイクルをロールオーバーします。
Oracleは、SQLステートメントを実行し、カーソルをそれに関連付ける実行サイクルを定義します。
次の図は、明示カーソルの実行サイクルを示しています。
各ステップを詳しく調べてみましょう。
カーソルを宣言します
明示カーソルを使用する前に、ブロックまたはパッケージの宣言セクションで次のように宣言する必要があります。
この構文では:
- まず、
CURSOR
キーワードの後にカーソルの名前を指定します。 - 次に、データをフェッチするためのクエリを定義します。
IS
キーワードの後。
カーソルを開く
カーソルから行のフェッチを開始する前に、カーソルを開く必要があります。カーソルを開くには、次の構文を使用します。
この構文では、cursor_name
が名前です。宣言セクションで宣言されたカーソルの。
カーソルを開くと、Oracleはクエリを解析し、変数をバインドして、関連するSQLステートメントを実行します。
Oracleは実行計画も決定します。 、ホスト変数とカーソルパラメータをSQLステートメントのプレースホルダーに関連付け、結果セットを決定し、カーソルを結果セットの最初の行に設定します。
次のチュートリアルでパラメータ化されたカーソルの詳細を説明します。
カーソルからフェッチ
FETCH
ステートメントは、現在の行の内容を変数に配置します。 FETCH
ステートメントの構文は次のとおりです。
結果セットのすべての行を取得するには、次のようにする必要があります。最後の行まで各行をフェッチします。
カーソルを閉じる
すべての行をフェッチした後、CLOSE
ステートメント:
カーソルを閉じると、割り当てられたメモリを適切なタイミングで解放するようにOracleに指示されます。
カーソルをで宣言した場合匿名ブロック、プロシージャ、または関数の場合、これらのオブジェクトの実行が終了すると、カーソルは自動的に閉じられます。
ただし、パッケージベースのカーソルは明示的に閉じる必要があります。まだ開いていないカーソルを閉じると、OracleはINVALID_CURSOR
例外を発生させることに注意してください。
明示的なカーソル属性
カーソル次の形式で参照できる4つの属性があります。
ここで、cursor_name
はの名前です。明示カーソル。
1)%ISOPEN
カーソルが開いている場合、またはFALSE
です。
そうでない場合。
2)%FOUND
この属性には4つの値があります:
-
NULL
最初のフェッチの前 -
TRUE
レコードが正常にフェッチされた場合 -
FALSE
行が返されない場合 -
INVALID_CURSOR
カーソルが開かれていない場合
3)%NOTFOUND
この属性には4つの値があります。
-
NULL
最初のフェッチの前 -
FALSE
レコードが取得された場合本質的に -
TRUE
行が返されない場合 -
INVALID_CURSOR
カーソルが開かれていない場合
3)%ROWCOUNT
%ROWCOUNT
属性は、カーソルからフェッチされた行数を返します。カーソルが開かれていない場合、この属性はINVALID_CURSOR
を返します。
PL / SQLカーソルの例
orders
テーブルとorder_items
テーブルを使用します。デモンストレーション用のサンプルデータベース。
次のステートメントは、顧客による売上収益を返すビューを作成します。
クレジット列の値は、総売上収益の5%です。
匿名を作成する必要があるとします。
- すべての顧客の与信限度額をゼロにリセットします。
- 売上高の降順で並べ替えられた顧客を取得し、100万の予算から新しい与信限度額を提供します。
次の匿名ブロックはロジックを示しています。
宣言セクションでは、3つの変数を宣言します。
最初の変数は
その初期値は1,000,000
です。
2番目の変数はc_sales
そのステートメントはsales
ビューからデータを取得します:
3番目の変数はc_sales
という名前のカーソルベースのレコード。
実行セクションでは、次の手順を実行します。
- まず、与信限度額をリセットします。
UPDATE
ステートメントを使用してすべての顧客をゼロにします。 - 次に、
c_sales
カーソルを開きます。 - 3番目に、カーソルから各行をフェッチします。各ループの反復で、与信限度額を更新し、予算を削減しました。フェッチする行がないか、予算が使い果たされると、ループは終了します。
- 最後に、カーソルを閉じます。
次のクエリは、
テーブル:
結果:
結果から明らかなように、最初の数人の顧客のみが与信限度額を持っています。すべての与信限度額を合計すると、次のように合計が100万になります。
、暗黙カーソルと明示カーソルを含むPL / SQLカーソルと、それらを効果的に使用してテーブルから行ごとにデータを処理する方法を理解する必要があります。
- このチュートリアルは役に立ちましたか?
- はいいいえ