一般ルール
1つのストアド プロシージャで同時に開けるカーソルの最大数は15です。
カーソル名は、次のリストにある有効な文字で作成します。
- 英大文字
- 英小文字
- $
- @
- #
- 数字
- 下線
ストアド プロシージャでは、オープン カーソルを使用した以下の文は許可されていません。
- POSITION
- REWIND
- SQLトランザクション文
DECLARE CURSOR文およびFOR文のカーソル
- DECLARE CURSOR文またはFORループ制御文のカーソルを削除できます。
- FOR文またはDECLARE CURSOR (ストアド プロシージャ形式)文で指定したSELECT文は、カーソル指定と呼ばれます。
- ストアド プロシージャでは、定位置カーソルと非定位置カーソルの両方を使用できます。
- FOR文で宣言されるカーソルとDECLARE CURSOR文で宣言されるカーソルには、次のような違いがあります。
FORループ カーソル | DECLARE CURSORカーソル |
---|---|
カーソルの有効範囲は、それが定義されているFOR文に限定されます。 FORループ カーソル内の列名またはその相関名の有効範囲は、FOR文の本体のみに制限されます。 FOR文が入れ子になっている場合、外側のFOR文で指定したカーソル名は、内側のFOR文内の文で参照できます。 |
カーソルの有効範囲は、そのカーソルが宣言されたBEGIN END複合文内になります。 カーソルの有効範囲は、複合文とその入れ子の複合文(存在する場合)です。 複合文が入れ子になっている場合、外側の複合文で指定したカーソルの有効範囲には、内側の複合文がすべて含まれます。 |
定位置DELETE文かUPDATE文でカーソルを参照すると、カーソルは更新可能になります。 | FOR UPDATEオプションの使用によって、カーソルは更新可能になります。 |
OPEN、FETCH、およびCLOSEは、FORループ実行の一部として暗黙的に行われます。 FOR文では、繰返しごとに(存在すれば)次の行をオープン カーソルのために取り出します。 |
OPEN、FETCH、またはCLOSEを明示的に指定する必要があります。 結果セット カーソルにCLOSEを指定すると、結果セットが返されなくなります。 |
カーソルが宣言されているFOR文にはラベルを付けることができます。 | DECLARE CURSOR文にはラベルを付けることができません。 |
FOR cursor_name文は、カーソル指定として指定したSELECT文のカーソルを暗黙的に開きます。 | OPEN cursor_name文は、カーソル指定として指定したSELECT文のカーソルを開きます。 |
カーソルのサポート
サポートは、カーソルがFORループ文によって開かれたのか、DECLARE CURSOR文で宣言したカーソルによって開かれたのかによって多少異なります。
FORループ カーソルのサポート
FORループ文の場合、次に示すダミーの繰返し文によって指定したカーソル用にカーソルを開きます。
FOR for_loop_variable AS [cursor_name CURSOR FOR] cursor_specification DO statement END FOR;
ここでcursor_specificationは1つのSELECT文、statementは1つまたは複数のSQL制御文またはDML文です。
FOR文は次のように実行されます。
- 結果セットから1つのデータ行を取り出して、各繰返しのfor_loop_variableに置く。
- (存在する場合)次の行データを取り出して、各繰返しのカーソルを増分する。DELETEおよびUPDATEのWHERE CURRENT OFフォームは次のように機能します。
- DELETE ... WHERE CURRENT OF cursor_nameは、現在取り出されている行をその実テーブルから削除します。
- UPDATE…WHERE CURRENT OF cursor_nameは、現在取り出されている行をその実テーブルで更新します。
DECLARE CURSORカーソルのサポート
DECLARE CURSOR文で定義したカーソルの場合、OPEN cursor_nameおよびFETCH cursor_nameの各文を明示的に実行する必要があります。
結果セット カーソルにCLOSEを指定すると、結果セットが返されないようになるので注意してください。
関連情報
ストアド プロシージャでのカーソルの使用の詳細については、DECLARE CURSOR (ストアド プロシージャ形式)、カーソル、およびFORを参照してください。