Symfoware Server SQLビギナーズガイド - FUJITSU - |
目次 索引 |
第4章 カーソルを使用するデータ操作の方法 |
カーソルは、表の中の1行を特定する仮想的な道具です。カーソルを使用して処理の対象とする行を特定しておいて、その行からデータを取り出したり、その行を更新したり、または削除したりすることができます。カーソルにより行を特定することを、カーソルを位置づけるといいます。
カーソルには、オープンされている状態と、クローズされている状態の2つがあります。一度もオープンされていないカーソルは、クローズされている状態と同じです。カーソルを使用してデータの操作ができるのは、オープンされている状態のときです。
オープンされた状態のカーソルは、表の特定の行を位置づけているときと、そうでないときがあります。カーソルの概念を理解しやすくするために、カーソルの位置には以下の4とおりがあると考えます。
先頭行の直前を位置づけている
特定の行を位置づけている
行と行の間を位置づけている
最終行の直後を位置づけている
カーソルの概念を以下に示します。なお、それぞれの操作に使用するSQL文については、この次に説明します。以下では説明を簡単にするために、在庫表を小さくした表を使用します。また、列名の記述は省いています。
カーソル系のSQL文を以下に示します。
カーソル宣言(DECLARE CURSOR)
OPEN文
CLOSE文
FETCH文
UPDATE文
DELETE文
カーソルを使用してデータ操作を行うには、あらかじめカーソルを宣言しておくことが必要です。カーソルの宣言では、データ操作を行う表や、表からデータを取り出す方法を指定します。カーソルを宣言するSQL文を、“カーソル宣言”と呼びます。カーソル宣言は非実行文です。カーソル宣言は、アプリケーションの実行順序とは関係なく、そのカーソルを使用するSQL文よりも前に記述しておくことが必要です。
カーソルを使用してデータ操作を実行する順序は以下のとおりです。
カーソルをオープンします。OPEN文を使用します。
カーソルを表の特定行に位置づけ、データを取り出します。FETCH文を使用します。
カーソルを位置づけた行のデータを処理します。
取り出したデータをアプリケーションで処理します。
カーソルを位置づけた行の値を更新します。UPDATE文を使用します。
カーソルを位置づけた行を削除します。DELETE文を使用します。
カーソルをクローズします。CLOSE文を使用します。
複数の行を処理する場合は、2)および3)を繰り返します。以上の操作の流れを以下に示します。
カーソルを使用してデータを操作するアプリケーションの例を以下に示します。このアプリケーションでは、在庫表について以下の処理を行います。
在庫数量が“0”の行を削除します。
製品名が“冷蔵庫”の行の倉庫番号を“5”に変更します。
製品名が“冷蔵庫”の行の在庫数量の合計を計算します。合計値は変数totalに入れます。
#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) コネクションを切断します。
目次 索引 |