SQL 解説書

FETCH

FETCH ステートメントは、カーソルの位置を結果表の次の行に移し、その行の値をホスト変数に割り当てます。

呼び出し

対話式 SQL 機能には外見上対話式の実行に見えるインターフェースが用意されている場合がありますが、 このステートメントはアプリケーション・プログラムに組み込むことだけが可能です。 これは、動的に準備できない実行可能ステートメントです。

許可

カーソルを使用するために必要な権限については、DECLARE CURSOR を参照してください。

構文

>>-FETCH--+-------+---cursor-name------------------------------->
          '-FROM--'
 
              .-,----------------.
              V                  |
>-----+-INTO-----host-variable---+---------+-------------------><
      '-USING DESCRIPTOR--descriptor-name--'
 

説明

cursor-name
取り出し操作で使用するカーソルを指定します。 DECLARE CURSOR で説明されているように、cursor-name (カーソル名) は、 宣言されたカーソルを指定していなければなりません。 ソース・プログラムにおいて、 FETCH ステートメントより前に DECLARE CURSOR ステートメントがなければなりません。 FETCH ステートメントを実行する場合、該当のカーソルはオープン状態でなければなりません。

そのカーソルの位置が、現在その結果表の最終行またはそれ以降にある場合、

ある行より前に現在カーソルが位置している場合、カーソルはその行に再位置づけされ、 INTO または USING で指定されたホスト変数に値が割り当てられます。

最終行以外の行に現在カーソルが位置している場合、カーソルは次の行に再位置づけされ、 その行の値は INTO または USING で指定されたホスト変数に割り当てられます。

INTO host-variable, ...
1 つまたは複数のホスト変数 (host-variable) を指定します。 そのホスト変数は、ホスト変数の宣言規則に従って記述されていなければなりません。 結果行の最初の値はリスト中の最初のホスト変数、 その次の値は 2 番目のホスト変数、以下同様に割り当てられます。 選択リストの LOB 値は、正規のホスト変数 (十分な大きさの場合)、 ロケーター変数、またはファイル参照変数に割り当てることができます。

USING DESCRIPTOR descriptor-name
ゼロ個以上のホスト変数の有効な記述を含む SQLDA を識別します。

FETCH ステートメントが処理される前に、 ユーザーは次に示す SQLDA 内のフィールドを設定する必要があります。

SQLDA には、すべての SQLVAR オカレンスが入るだけの十分な記憶域がなければなりません。 したがって、SQLDABC の値は 16 + SQLN*(N) 以上でなければなりません (N は 1 つの SQLVAR オカレンスの長さ)。

LOB または構造タイプの結果列を入れるには、 各選択リスト項目 (または結果表の列) ごとに 2 つの SQLVAR 項目が必要です。 SQLDOUBLED、LOB、および構造タイプの列について説明した、SQLDA に対する DESCRIBE の効果を参照してください。

SQLD に設定する値は、ゼロ以上で SQLN 以下でなければなりません。 詳しくは、付録 C, SQL 記述子域 (SQLDA)を参照してください。

INTO 文節で指定されるか、 または SQLDA に記述される n 番目の変数は、 カーソルの結果表の n 番目の列に対応します。 各変数のデータ・タイプは、それに対応する列と互換性がなければなりません。

各変数には、"言語要素"で説明されている規則に従って値が割り当てられます。 変数の数がその行の値の数よりも少ない場合、 SQLDA の SQLWARN3 フィールドが 'W' に設定されます。 変数の数が結果表の列の数よりも多い場合、警告は出されません。 割り当てエラーが発生すると、値は変数に割り当てられず、 値はそれ以上変数に割り当てられません。 それまでにすでに変数に割り当てられていた値はそのままになります。

例 1: この C の例では、 FETCH ステートメントは SELECT ステートメントの結果を取り出して、 プログラム変数 dnumdname、 および mnum に入れます。 取り出す行がなくなった場合、見つからないことを示す状態が戻されます。

  EXEC SQL  DECLARE C1 CURSOR FOR
 
    SELECT DEPTNO, DEPTNAME, MGRNO FROM TDEPT
       WHERE ADMRDEPT = 'A00';
  EXEC SQL  OPEN C1;
   while (SQLCODE==0) {
     EXEC SQL FETCH C1 INTO :dnum, :dname, :mnum;
   }
 
  EXEC SQL  CLOSE C1;

例 2: この FETCH ステートメントは SQLDA を使用しています。

FETCH CURS USING DESCRIPTOR :sqlda3


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]