Oracle PL/SQL カーソル: 暗黙的、明示的、For ループと例
⚡ スマートサマリー
カーソル Oracle PL/SQLでは、SQL文によって返される行を保持するコンテキスト領域へのポインタが用いられます。ポインタには2種類あり、DML操作のために自動的に作成される暗黙のカーソルと、プログラマが宣言および制御する明示のカーソルがあります。

PL/SQLのCURSORとは何ですか?
カーソルとは、コンテキスト領域を指すポインターのことです。 Oracle 処理のためのコンテキスト領域を作成します SQL この領域には、声明に関するすべての情報が含まれています。
PL / SQLの カーソルを使用することで、プログラマーはコンテキスト領域を制御できます。カーソルはSQL文によって返された行を保持し、カーソルが保持する行のセットはアクティブセットと呼ばれます。これらのカーソルには名前を付けることができ、コードの別の場所から参照できます。
カーソルには2種類あります。
- 暗黙カーソル
- 明示カーソル
暗黙カーソル
いつでも DML操作 データベースで操作が発生すると、その操作で影響を受けた行を保持する暗黙のカーソルが作成されます。これらのカーソルには名前を付けることができないため、コードの他の場所から制御したり参照したりすることはできません。カーソル属性を介して参照できるのは、最新のカーソルのみです。
明示カーソル
プログラマは、DML 操作を実行するための名前付きコンテキスト領域を作成し、より詳細な制御を行うことができます。明示的なカーソルは、宣言セクションで定義する必要があります。 PL/SQLブロックそして、それはコード内で使用する必要のあるSELECT文のために作成されます。
明示的なカーソルを操作する際の手順は以下のとおりです。
- カーソルを宣言する: カーソルを宣言するということは、宣言部分で定義された SELECT 文用の名前付きコンテキスト領域を 1 つ作成することを意味します。このコンテキスト領域の名前は、カーソル名と同じです。
- カーソルを開く: カーソルを開くと、PL/SQLはこのカーソル用のメモリを割り当てるように指示されます。これにより、カーソルはレコードを取得する準備が整います。
- カーソルからデータを取得しています: このプロセスでは、SELECT ステートメントが実行され、フェッチされた行が割り当てられたメモリに格納されます。これらはアクティブ セットと呼ばれます。カーソルからのデータ取得はレコード レベルのアクティビティであり、レコードごとにデータにアクセスできます。各フェッチ ステートメントは 1 つのアクティブ セットを取得し、その特定のレコードの情報を保持します。このステートメントは、レコードを取得して INTO 句の変数に割り当てる SELECT ステートメントと同じですが、エラーは発生しません。 例外.
- カーソルを閉じる: すべてのレコードが取得されたら、カーソルを閉じて、このコンテキスト領域に割り当てられたメモリを解放する必要があります。
構文
DECLARE CURSOR <cursor_name> IS <SELECT statement>; <cursor_variable declaration>; BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
上記の構文において、宣言部にはカーソルの宣言と、取得したデータが格納されるカーソル変数の宣言が含まれています。カーソルは、カーソル宣言で指定されたSELECT文のために作成されます。実行部では、宣言されたカーソルが開かれ、データが取得され、閉じられます。
カーソルの属性
暗黙カーソルと明示カーソルには、それぞれアクセス可能な属性があります。これらの属性は、カーソル操作に関する詳細情報を提供します。以下に、さまざまなカーソル属性とその使用方法を示します。
| カーソル属性 | 詳細説明 |
|---|---|
| %FOUND | 直近のフェッチ操作でレコードが正常に取得された場合はブール値TRUEを返し、そうでない場合はFALSEを返します。 |
| %見つかりません | %FOUND とは逆の動作をします。直近のフェッチ操作でレコードを取得できなかった場合に TRUE を返します。 |
| %ISOPEN | 指定されたカーソルが既に開いている場合はブール値TRUEを返し、そうでない場合はFALSEを返します。 |
| %ROWCOUNT | 操作によって影響を受けた、または取得されたレコードの実際の数を表す数値を返します。 |
明示的なカーソルの例: この例では、明示的なカーソルを宣言、オープン、フェッチ、クローズする方法を見ていきます。カーソルを使用して、emp テーブルからすべての従業員名を射影します。また、カーソル属性を使用して、ループを設定し、カーソルからすべてのレコードをフェッチします。
以下のスクリーンショットは、明示的なカーソルの例とその出力を示しています。 Oracle.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; END IF; Dbms_output.put_line('Employee Fetched:'||lv_emp_name); END LOOP; Dbms_output.put_line('Total rows fetched is'||guru99_det%ROWCOUNT); CLOSE guru99_det; END; /
出力
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Code 説明
- Code 2行目: ステートメント「SELECT emp_name FROM emp」に対してカーソルguru99_detを宣言します。
- Code 3行目: 変数 lv_emp_name を宣言すると、 %タイプ emp.emp_name に固定されています。
- Code 5行目: カーソル guru99_det を開きます。
- Code 6行目: emp テーブル内のすべてのレコードを取得するように、基本的なループ文を設定します。
- Code 7行目: guru99_detデータを取得し、その値をlv_emp_nameに割り当てます。
- Code 8行目: カーソル属性 %NOTFOUND を使用して、カーソル内のすべてのレコードが取得されたかどうかを確認します。取得された場合は TRUE を返し、ループを終了します。そうでない場合は、カーソルからデータの取得を継続し、出力します。
- Code 10行目: ループステートメントの EXIT 条件。
- Code 12行目: 取得した従業員名を出力します。
- Code 14行目: カーソル属性 %ROWCOUNT を使用して、カーソルによって取得されたレコードの総数を調べます。
- Code 15行目: ループを抜けると、カーソルが閉じられ、割り当てられたメモリが解放されます。
FOR ループ カーソル ステートメント
カーソル FOR ループ カーソル操作に使用できます。FORループ文では、範囲制限の代わりにカーソル名を指定することで、ループがカーソルの最初のレコードから最後のレコードまで実行されるようにできます。カーソル変数、カーソルのオープン、フェッチ、クローズはすべてFORループによって暗黙的に行われます。
構文
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
上記の構文では、宣言部分にカーソルの宣言が含まれています。カーソルは、カーソル宣言で指定されたSELECT文のために作成されます。実行部分では、宣言されたカーソルがFORループ内に設定され、この場合、ループ変数「I」がカーソル変数として機能します。
Oracle ループのためのカーソルの例: この例では、カーソルFORループを使用して、empテーブルからすべての従業員名を抽出します。
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line('Employee Fetched:'||lv_emp_name.emp_name); END LOOP; END; /
出力
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Code 説明
- Code 2行目: ステートメント「SELECT emp_name FROM emp」に対してカーソルguru99_detを宣言します。
- Code 4行目: カーソル用のFORループをループ変数lv_emp_nameで構築します。
- Code 6行目: ループの各反復で従業員名を出力します。
- Code 7行目: ループを終了します(END LOOP)。
注意: カーソルFORループでは、カーソルのオープン、フェッチ、クローズはFORループによって暗黙的に行われるため、カーソル属性を使用することはできません。

