FETCH (ストアド プロシージャ形式) - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/vqj1592443206677.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1148
Product Category
Software
Teradata Vantage

カーソルを応答セットの次の行(デフォルト)または任意指定の行に置き、その行の値をローカル変数やパラメータに割り当てます。

ANSI準拠

ANSI/ISO SQL:2011準拠。

必要な権限

なし。

呼び出し

実行可能形式。

ストアド プロシージャのみ。

構文

FETCH [ [ NEXT | FIRST ] FROM ] cursor_name
  INTO { local_variable_name | parameter_reference } [,...] ;

構文要素

NEXT
応答セットから次の行(存在する場合)を取り出す。
NEXTがデフォルトです。
FIRST
応答セットから最初の行を取り出す。
cursor_name
オープンしている選択カーソル(割り当てられたカーソルを含む)の名前。ここから行が取り出されます。
local_variable_name
取り出した行を割り当てるローカル変数の名前。
事前定義データ型とUDT (VARIANT_TYPE UDTを除く)のどちらもサポートされます。
parameter_reference
取り出した行を割り当てるINOUTまたはOUTパラメータの名前。

使用上の注意

  • 応答セットに行がない場合
    FETCHを実行したときに応答セット内に行がない場合、システムは次の実行時例外を返します。
    • SQLCODEは7362に設定される
    • SQLSTATEは‘02000’に設定される

    システムは、この実行時警告条件をプロシージャ内で処理します。これが処理されないと、プロシージャは、失敗した取り出し操作の次の文から続行します。

  • 取り出した行の割り当て順序

    システムは行の値をローカル変数または出力パラメータに割り当てます。割り当て順序は、その変数およびパラメータをINTOリスト内で宣言した順になります。

  • 一般ルール

    指定したカーソルは、FETCHの実行時に開いている必要があります。

    カーソルを開いていないと、システムは次の実行時例外を返します。
    • SQLCODEは7631に設定される
    • SQLSTATEは‘24501’に設定される

    FETCHによって返される値の数は、INTOリスト内で宣言したローカル変数および出力パラメータの数と一致している必要があります。

    不一致が確認されるタイミング データベースが返す内容
    コンパイル コンパイル エラーSPL1027
    実行時 実行時例外:
    • SQLCODEは7608に設定される
    • SQLSTATEは‘T7608’に設定される

    取り出される列のデータ型は、その割り当て先のローカル変数またはOUTパラメータに指定したデータ型と一致しなければなりません。

    これは特にUDTタイプに当てはまります。なぜなら、システムはタイプに定義されているどのキャストも暗黙的に適用しないからです。

    この制限は、以下のいずれかを行なうことにより対処できます。
    • カーソル選択リストのデータ型を事前定義タイプからUDTへ、またはUDTから事前定義タイプへ明示的にCASTする(AS ASSIGNMENTオプションを指定するターゲット タイプへのキャストも定義している場合)。
    • ターゲット タイプを戻すメソッドを呼び出す。

    INTOリスト内のテーブル列に名前を付ける単純ターゲット指定を指すことはできません。無効なINTOリストを指定すると、システムはコンパイル時にエラーSPL1028を返します。

    代わりに、出力パラメータ(INOUTおよびOUT)またはローカル変数を指定する必要があります。

  • FIRSTおよびNEXTのルール
    NEXTまたはFIRSTを指定しない場合、あるいはNEXTを指定して、カーソルが応答セット内の最後の行または最後の行の後に置かれる場合、あるいはデータが存在しない場合、ストアド プロシージャはカーソルを最後の行の後に配置し、システムは次の完了条件を返します。
    • SQLCODEは7632に設定される
    • SQLSTATEは‘02000’に設定される

    この場合、この値のINTOリスト内で指定した出力パラメータまたはローカル変数は変更されません。

    FIRSTを指定する場合は、参照カーソルの宣言にSCROLLを指定しなければなりません。

    SCROLLを指定しておかないと、システムはコンパイル時にエラーSPL1132を返します。

    FIRSTを指定していていも、データが存在しないと、システムは次の完了条件を返します。
    • SQLCODEは7632に設定される
    • SQLSTATEは‘02000’に設定される

    この場合、この値のINTOリスト内で指定した出力パラメータまたはローカル変数は変更されません。

例: データ型が一致するローカル変数に割り当てられた列を返す

次の例では、FETCH文によって参照されるカーソルが、一致したデータ型を持つローカル変数に正しく割り当てられている列を戻す有効なカーソル指定となっています。

CREATE PROCEDURE sp1()
BEGIN
  DECLARE var1 INTEGER;
  DECLARE var2 CHARACTER(30)
  DECLARE projcursor CURSOR FOR
    SELECT projid, projectdesc
    FROM project
    ORDER BY projid;
  OPEN projcursor;
   WHILE (SQLCODE=0)
   DO
    FETCH projcursor INTO var1, var2;
   END WHILE;
  CLOSE projcursor;
END;

例: FETCH文およびWHILEループの使用

次の例では、カーソルがすでに応答セット内の最後の行の後ろに置かれているために、WHILEループの後のFETCH文で完了条件SQLCODE 7632およびSQLSTATE '02000'が生じており、「no rows found」というメッセージを返しています。

CREATE PROCEDURE sp1 (OUT par1 CHARACTER(50))
BEGIN
  DECLARE var1 INTEGER;
  DECLARE projcursor CURSOR FOR
    SELECT projid, projectdesc
    FROM project;
  OPEN projcursor;
   WHILE (SQLCODE = 0)
   DO
    FETCH projcursor INTO var1, par1;
   END WHILE;
  FETCH projcursor INTO var1, par1;
  CLOSE projcursor;
END;

例: FETCH文内でのFETCH指向の使用

次の例は、FETCH文の中の取り出し方向の使用法を説明しています。projectテーブルにはsp1の実行開始時に10行が含まれているとします。

最初のFETCH文は最初の行を返し、projcursorがオープンしてから他に行が取り出されなかった場合、2番目のFETCHが2番目の行を返します。

CREATE PROCEDURE sp1 (OUT par1 INTEGER)
BEGIN
  DECLARE var1 CHARACTER(5);
  DECLARE var2 INTEGER;
  DECLARE projcursor SCROLL CURSOR FOR
    SELECT projectstatus
    FROM project;
  OPEN projcursor;
    FETCH FIRST projcursor INTO var1;
    ...
    FETCH NEXT projcursor INTO var1;
    ...
  CLOSE projcursor;
END;

例: FETCH FIRSTの使用

次に、FETCH FIRSTの使用法の例を示します。projectテーブルはsp1の実行開始時に空白であるとします。

テーブルに行が含まれていないため、FETCH文でコンパイル ステータスSQLCODE 7632およびSQLSTATE '02000'が発生し、「no rows found」というメッセージを返しています。

CREATE PROCEDURE sp1 (OUT par1 INTEGER)
BEGIN
  DECLARE var1 CHARACTER(5);
  DECLARE var2 INTEGER;
  DECLARE projcursor SCROLL CURSOR FOR
    SELECT projectstatus
    FROM project;
  OPEN projcursor;
    FETCH FIRST projcursor INTO var1;
    ...
  CLOSE projcursor;
END;