4.8.3 配列を使用したUPDATE機能
(1) 概要
複数回分のデータを設定した配列型の変数を指定することで,一つのSQL文で複数回分の表の列の更新ができます。
HiRDBクライアントとHiRDBサーバとの間の通信回数を削減できるため,HiRDBクライアントからHiRDBサーバにアクセスし,大量データを高速に更新する場合に有効です。
(2) 使用方法
(a) 静的に実行する場合
UPDATE文で,FOR句に埋込み変数を指定し,かつ探索条件中に指定した埋込み変数と標識変数をすべて配列型の変数にしてください。一括して更新する回数は,FOR句に指定した埋込み変数で制御します。
(b) 動的に実行する場合
次に示す手順で実行してください。
-
PREPARE文で,UPDATE文(更新値や探索条件中に?パラメタを指定)を前処理します。
-
EXECUTE文のUSING句に,前処理したUPDATE文の入力?パラメタに与える値を配列で指定し,かつBY句に埋込み変数を指定してください。一括して更新する回数は,BY句に指定した埋込み変数で制御します。
動的に実行する場合の注意事項を次に示します。
-
USING句で埋込み変数を指定する場合,埋込み変数及び標識変数をすべて配列型の変数にしてください。
-
USING句でSQL記述領域を指定する場合,SQLDATAが指すすべての領域に配列形式でデータを指定してください。また,SQLSYS領域にデータ型に応じた値を設定してください。
(3) 注意事項
-
UPDATE文のFOR句,又はEXECUTE文のBY句の埋込み変数に,書き込み領域以上の回数を指定すると,DB破壊,又はUAP側の領域破壊を起こすおそれがあります。
(4) 使用例
- 例:
-
ファイルから読んだデータを配列形式の埋込み変数に設定し,在庫表(ZAIKO)に対して,一括で複数回の削除をします。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXCOLUMN 80
#define INFILE "inputf1"
void abnormalend();
FILE *input ;
main() {
char indata[MAXCOLUMN];
char in_scode[5];
int in_suryo;
int i;
EXEC SQL BEGIN DECLARE SECTION;
short xupdate_num;
/* 配列型の埋込み変数の宣言 */
char xscode[50][5]; /* SCODE(CHAR(4)型の列) への探索条件用 */
long xsuryo[50]; /* ZSURYO(INTEGER型の列)への更新値指定用 */
EXEC SQL END DECLARE SECTION;
-------(HiRDBへのCONNECT処理(省略))-------
input = fopen(INFILE, "r");
if (input == NULL) {
fprintf(stderr, "can't open %s.", INFILE);
goto FIN;
}
EXEC SQL WHENEVER SQLERROR PERFORM abnormalend;
/* 一括更新回数設定 (最大50回に設定) */
xupdate_num=50;
while (!feof(input)) {
/* 配列変数に50回分(ファイルの終わりに到達した場合はその行まで) */
/* の更新/探索条件データを設定する */
for ( i = 0; i < 50; i++) {
/* ファイルからデータを読み込む */
fgets(indata, MAXCOLUMN, input);
if (feof(input)){
/* ファイルの終わりに到達したら,ここまでの配列要素数を */
/* 一括更新回数に設定してfor文を抜ける */
xupdate_num= i;
break;
}
sscanf(indata, "%4s %8d", in_scode, &in_suryo);
/* 配列変数の要素に更新/探索条件データを設定 */
strncpy(xscode[i], in_scode, 5);
xsuryo[i] = in_suryo;
}
/* UPDATE実行 */
EXEC SQL FOR :xupdate_num
UPDATE ZAIKO SET ZSURYO = :xsuryo WHERE SCODE = :xscode ;
}
EXEC SQL COMMIT;
printf(" *** normal ended ***\n");
FIN:
if (input != NULL) {
fclose(input);
}
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL WHENEVER SQLWARNING CONTINUE;
EXEC SQL DISCONNECT;
return(0);
}
void abnormalend()
{
int wsqlcode;
if (input != NULL) {
fclose(input);
}
wsqlcode = -SQLCODE;
printf("\n*** HiRDB SQL ERROR SQLCODE = %d \n", wsqlcode);
printf("SQLERRMC = %s\n", SQLERRMC);
EXEC SQL ROLLBACK;
EXEC SQL DISCONNECT;
exit(1);
}