スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド
複数回分のデータを設定した配列型の変数を指定することで,一つのSQL文で複数回分の表の列の更新ができます。
HiRDBクライアントとHiRDBサーバとの間の通信回数を削減できるため,HiRDBクライアントからHiRDBサーバにアクセスし,大量データを高速に更新する場合に有効です。
UPDATE文で,FOR句に埋込み変数を指定し,かつ探索条件中に指定した埋込み変数と標識変数をすべて配列型の変数にしてください。一括して更新する回数は,FOR句に指定した埋込み変数で制御します。
次に示す手順で実行してください。
動的に実行する場合の注意事項を次に示します。
#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); }
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.