Symfoware Server SQLビギナーズガイド - FUJITSU -
目次 索引 前ページ次ページ

第4章 カーソルを使用するデータ操作の方法

4.1 カーソルの概念

カーソルは、表の中の1行を特定する仮想的な道具です。カーソルを使用して処理の対象とする行を特定しておいて、その行からデータを取り出したり、その行を更新したり、または削除したりすることができます。カーソルにより行を特定することを、カーソルを位置づけるといいます。

カーソルには、オープンされている状態と、クローズされている状態の2つがあります。一度もオープンされていないカーソルは、クローズされている状態と同じです。カーソルを使用してデータの操作ができるのは、オープンされている状態のときです。

オープンされた状態のカーソルは、表の特定の行を位置づけているときと、そうでないときがあります。カーソルの概念を理解しやすくするために、カーソルの位置には以下の4とおりがあると考えます。

カーソルの概念を以下に示します。なお、それぞれの操作に使用するSQL文については、この次に説明します。以下では説明を簡単にするために、在庫表を小さくした表を使用します。また、列名の記述は省いています。

[図:カーソルの概念]


■カーソルを使用したデータ操作の順

カーソル系のSQL文を以下に示します。

カーソルを使用してデータ操作を行うには、あらかじめカーソルを宣言しておくことが必要です。カーソルの宣言では、データ操作を行う表や、表からデータを取り出す方法を指定します。カーソルを宣言するSQL文を、“カーソル宣言”と呼びます。カーソル宣言は非実行文です。カーソル宣言は、アプリケーションの実行順序とは関係なく、そのカーソルを使用するSQL文よりも前に記述しておくことが必要です。

カーソルを使用してデータ操作を実行する順序は以下のとおりです。

  1. カーソルをオープンします。OPEN文を使用します。

  2. カーソルを表の特定行に位置づけ、データを取り出します。FETCH文を使用します。

  3. カーソルを位置づけた行のデータを処理します。

  4. カーソルをクローズします。CLOSE文を使用します。

複数の行を処理する場合は、2)および3)を繰り返します。以上の操作の流れを以下に示します。

[図:カーソルによるデータ操作の流れ]

カーソルを使用してデータを操作するアプリケーションの例を以下に示します。このアプリケーションでは、在庫表について以下の処理を行います。

[図:カーソルを使用してデータ操作を行うアプリケーションの例]

#include <stdio.h>
#include <string.h>

EXEC SQL BEGIN DECLARE SECTION;
    char    SQLSTATE[6];                                                  …(1)
    char    SQLMSG[256];                                                  …(1)
    char CHARACTER SET IS NCHAR   outdata1[21];                           …(1)
    long    outdata2;
EXEC SQL END DECLARE SECTION;

main()
{
   long   total;
   memset(SQLSTATE, 0x00, 6);                                              …(2)
   memset(SQLMSG, 0x00, 256);                                              …(2)
   memset(outdata1, 0x00, 21);                                             …(2)
   EXEC SQL CONNECT TO DEFAULT;                                            …(3)
   EXEC SQL DECLARE CU1 CURSOR FOR                                         …(4)
                      SELECT 製品名, 在庫数量 FROM 在庫管理.在庫表;
   EXEC SQL WHENEVER NOT FOUND GOTO :END;                                  …(5)
   total = 0;
   EXEC SQL OPEN CU1;                                                      …(6)
   while(1) {
       EXEC SQL FETCH CU1 INTO :outdata1, :outdata2;                       …(7)
       if( outdata2 == 0 ) {
           EXEC SQL DELETE FROM 在庫管理.在庫表 WHERE CURRENT OF CU1;       …(8)
           continue;
       }
       if( memcmp(outdata1, "冷蔵庫              ", 20) == 0 ) {           …(9)
           total += outdata2;                                             …(10)
           EXEC SQL UPDATE 在庫管理.在庫表 SET 倉庫番号 = 5
                                                WHERE CURRENT OF CU1;
       }
    }
END:
    EXEC SQL CLOSE CU1;                                                   …(11)
    EXEC SQL COMMIT WORK;                                                 …(12)
    EXEC SQL DISCONNECT DEFAULT;                                          …(13)
}

(1) 結果データを格納するホスト変数を宣言します。

(2) ホスト変数を初期化します。

(3) コネクションを接続します。

(4) カーソルCU1の宣言文です。在庫表の製品名および在庫数量の列だけの表に対するカーソルCU1を宣言しています。

(5) (7)のカーソルの位置づけで、カーソルが最終行の次まで進んだとき、ENDへ進むことを指定しています。

(6) カーソルCU1の使用を開始します。ここで(4)の宣言のカーソル表が作成され、その先頭の行の直前にカーソルが位置づけられます。

(7) カーソルCU1を次の行(OPEN直後の場合は表の先頭行)に位置づけ、その位置づけた行からデータを取り出します。製品名のデータをoutdata1に、在庫数量のデータをoutdata2に格納します。

(8) (7)の文の実行結果をチェックします。在庫数量が“0”の場合は、その行を削除します。

(9) (7)の文の実行結果をチェックします。製品名が“冷蔵庫”の場合は、読み出した在庫数量(outdata2に格納されています)をtotalに積算します。

(10) カーソルの位置づけられている行(製品名が“冷蔵庫”)の倉庫番号を“5”に変更します。

(11) カーソルの使用を終了します。

(12) 現行のトランザクションを終了します。

(13) コネクションを切断します。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 2006