Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


4.8.4 配列を使用したDELETE機能

〈この項の構成〉

(1) 概要

複数回分のデータを設定した配列型の変数を指定することで,一つのSQL文で複数回分の行の削除ができます。

HiRDBクライアントとHiRDBサーバとの間の通信回数を削減できるため,HiRDBクライアントからHiRDBサーバにアクセスし,大量データを高速に削除する場合に有効です。

(2) 使用方法

(a) 静的に実行する場合

DELETE文で,FOR句に埋込み変数を指定し,かつ探索条件中に指定した埋込み変数と標識変数をすべて配列型の変数にしてください。一括して削除する回数は,FOR句に指定した埋込み変数で制御します。

(b) 動的に実行する場合

次に示す手順で実行してください。

  1. PREPARE文で,DELETE文(探索条件中に?パラメタを指定)を前処理します。

  2. EXECUTE文のUSING句に,前処理したDELETE文の入力?パラメタに与える値を配列で指定し,かつBY句に埋込み変数を指定してください。一括して削除する回数は,BY句に指定した埋込み変数で制御します。

動的に実行する場合の注意事項を次に示します。

  • USING句で埋込み変数を指定する場合,埋込み変数及び標識変数をすべて配列型の変数にしてください。

  • USING句でSQL記述領域を指定する場合,SQLDATAが指すすべての領域に配列形式でデータを指定してください。また,SQLSYS領域にデータ型に応じた値を設定してください。

(3) 注意事項

  1. 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 i;
 
  EXEC SQL BEGIN DECLARE SECTION;
    short   xdelete_num;
    /* 配列型の埋込み変数の宣言 */
    char    xscode[50][5]; /* SCODE(CHAR(4)型の列) への探索条件用 */
  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回に設定) */
  xdelete_num=50;
  while (!feof(input)) {
    /* 配列変数に50回分(ファイルの終わりに到達した場合はその行まで) */
    /* の探索条件データを設定する                                    */
    for ( i = 0; i < 50; i++) {
      /* ファイルからデータを読み込む */
      fgets(indata, MAXCOLUMN, input);
      if (feof(input)){
        /* ファイルの終わりに到達したら,ここまでの配列要素数を  */
        /* 一括削除回数に設定してfor文を抜ける                  */
        xdelete_num= i;
        break;
      }
      sscanf(indata, "%4s", in_scode);
      /* 配列変数の要素に探索条件データを設定 */
      strncpy(xscode[i], in_scode, 5);
    }
    /* DELETE実行 */
    EXEC SQL FOR :xdelete_num
      DELETE FROM ZAIKO 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);
}