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

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

4.1 カーソルの概念

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

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

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

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

[図:カーソルの概念]

image
image

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

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

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

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

  1. カーソルをオープンします。OPEN文を使用します。
  2. カーソルを表の特定行に位置づけ、データを取り出します。FETCH文を使用します。
  3. カーソルを位置づけた行のデータを処理します。
  4. カーソルをクローズします。CLOSE文を使用します。

複数の行を処理する場合は、2)および3)を繰り返します。以上の操作の流れを“図:カーソルによるデータ操作の流れ”に示します。

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

image

カーソルを使用してデータを操作する応用プログラムの例を“図:カーソルを使用してデータ操作を行う応用プログラムの例”に示します。この応用プログラムでは、在庫表について以下の処理を行います。

[図:カーソルを使用してデータ操作を行う応用プログラムの例]

#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) 富士通株式会社 2003