ページのトップに戻る
Symfoware Server SQLビギナーズガイド

4.4 カーソルの位置づけおよびデータの取出し

以下に示すデータ操作を行うためにFETCH文を使用します。

FETCH文の指定例を以下に示します。

1

在庫表から、倉庫番号が“2”の製品の製品番号と在庫数量を取り出すカーソルが宣言されているとします。このカーソルを1行分移動し値を取り出します。

注) FETCH文は表から複数の行のデータを取り出すために繰り返し実行します。一般的には、この位置にホスト言語で繰返しを制御するための文を指定します。


例1のFETCH文を実行した結果を以下に示します。なお、すでに同じFETCH文が2回実行されており、カーソルは2行目を位置づけている状態とします。

図4.7 FETCH文によるカーソルの位置づけの例

カーソル名で指定するカーソルの宣言は、アプリケーションの記述の順序でこのFETCH文よりも先に記述されていることが必要です。FETCH文で指定するカーソルは、オープンされていることが必要です。オープンされていないカーソルを指定するとエラーになります。また、カーソルが最終行を位置づけている状態でFETCH文を実行すると、結果の状態は“データなし”になります。カーソルが最終行の直後を位置づけている状態で、FETCH文を実行した場合は“カーソル不当状態”になります。

取り出したデータを格納するホスト変数

取出し相手リストに、カーソルを位置づけた行の値を格納するホスト変数を指定します。ホスト変数は、カーソル表の列と同じ数だけ指定することが必要です。取り出した列のデータは、左から数えて同じ順番のホスト変数に格納されます。

NULL値を含むデータを取り出す

NULL値のデータを取り出すには、取り出したデータを格納するホスト変数に、標識変数を対にして指定します。指定例を以下に示します。

2

例1のFETCH文に標識変数を指定した例です。

FETCH 在庫表カーソル INTO :ITMNO INDICATOR :ITMNO_INDICATOR 

                          :STOCKQTY INDICATOR :STOCKQTY_INDICATOR

例2では、“ITMNO_INDICATOR”および“STOCKQTY_INDICATOR”が標識変数です。FETCH文で標識変数に格納される値は“表2.1 列の値と標識変数に格納される値”を参照してください。

標識変数を指定しないで、取り出すデータがNULL値になると、FETCH文はエラーになります。列の値にNULL値が含まれるかどうかが分からない場合には、必ず標識変数を指定してください。

いろいろな方向にカーソルを移動する

FETCH文の取出し方向の指定により、いろいろな方向にカーソルを移動することができます。取出し方向を指定するときは、カーソル宣言にSCROLLを指定します。取出し方向を省略した場合は、NEXTが指定されたものとみなします。

それぞれの指定例を以下に示します。b.からf.のカーソル宣言は、a.と同様とします。

  1. 現在行の次の行の値を取り出します(NEXT指定)。カーソルは“図4.8 いろいろな方向にカーソルを移動する例”のカーソル[5]に位置づけられます。

    DECLARE CSR1 SCROLL CURSOR FOR SELECT C1, C2 FROM S1.T1
          …
        OPEN  CSR1
          …
        FETCH  NEXT FROM CSR1 INTO :H1, :H2
                (1)

    (1) 取出し方向


  2. 現在行の前の行の値を取り出します(PRIOR指定)。カーソルは“図4.8 いろいろな方向にカーソルを移動する例”のカーソル[4]に位置づけられます。

    FETCH PRIOR FROM CSR1 INTO :H1,:H2

  3. 現在行に関係なく、先頭行の値を取り出します(FIRST指定)。カーソルは、“図4.8 いろいろな方向にカーソルを移動する例”のカーソル[1]に位置づけられます。

    FETCH FIRST FROM CSR1 INTO :H1,:H2

  4. 現在行に関係なく、最終行の値を取り出します(LAST指定)。カーソルは、“図4.8 いろいろな方向にカーソルを移動する例”のカーソル[8]に位置づけられます。

    FETCH LAST FROM CSR1 INTO :H1,:H2

  5. 現在行に関係なく、先頭行または最終行から数えた行番号の値を取り出します(ABSOLUTE指定)。

    FETCH ABSOLUTE 2 FROM CSR1 INTO :H1,:H2

    FETCH ABSOLUTE -2 FROM CSR1 INTO :H1,:H2

  6. 現在行から数えた行番号の値を取り出します(RELATIVE指定)。

    FETCH RELATIVE 2 FROM CSR1 INTO :H1,:H2

    FETCH RELATIVE -3 FROM CSR1 INTO :H1,:H2

    図4.8 いろいろな方向にカーソルを移動する例