PL / SQLカーソル

要約:このチュートリアルでは、PL / SQLカーソルとその使用法について学習します。

カーソルはクエリの結果を指すポインタ。 PL / SQLには、暗黙カーソルと明示カーソルの2種類のカーソルがあります。

暗黙カーソル

OracleがSELECT INTOINSERTUPDATE、およびDELETEの場合、暗黙カーソルが自動的に作成されます。

Oracleは、暗黙カーソルの実行サイクル全体を内部的に管理し、SQL%ROWCOUNTSQL%ISOPENSQL%FOUND、およびSQL%NOTFOUND

クエリが0行または複数行を返す場合、暗黙カーソルはエレガントではありません。これにより、それぞれNO_DATA_FOUNDまたはTOO_MANY_ROWS例外が発生します。

明示カーソル

明示カーソルは現在のブロックまたはパッケージ仕様の宣言セクションで明示的に宣言されたSELECTステートメント。

明示カーソルの場合、続きがあります。 OPENFETCH、および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%です。

匿名を作成する必要があるとします。

  1. すべての顧客の与信限度額をゼロにリセットします。
  2. 売上高の降順で並べ替えられた顧客を取得し、100万の予算から新しい与信限度額を提供します。

次の匿名ブロックはロジックを示しています。

宣言セクションでは、3つの変数を宣言します。

最初の変数は

その初期値は1,000,000です。

2番目の変数はc_salesそのステートメントはsalesビューからデータを取得します:

3番目の変数はc_salesという名前のカーソルベースのレコード。

実行セクションでは、次の手順を実行します。

  • まず、与信限度額をリセットします。 UPDATEステートメントを使用してすべての顧客をゼロにします。
  • 次に、c_salesカーソルを開きます。
  • 3番目に、カーソルから各行をフェッチします。各ループの反復で、与信限度額を更新し、予算を削減しました。フェッチする行がないか、予算が使い果たされると、ループは終了します。
  • 最後に、カーソルを閉じます。

次のクエリは、

テーブル:

結果:

結果から明らかなように、最初の数人の顧客のみが与信限度額を持っています。すべての与信限度額を合計すると、次のように合計が100万になります。

、暗黙カーソルと明示カーソルを含むPL / SQLカーソルと、それらを効果的に使用してテーブルから行ごとにデータを処理する方法を理解する必要があります。

  • このチュートリアルは役に立ちましたか?
  • はいいいえ

Leave a Reply

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です