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

第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