Hitachi

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


8.2.7 構造体の参照

〈この項の構成〉

(1) 概要

オプションを指定すると,C言語の構造体を使用して,複数個の埋込み変数を一度に指定できます。

構造体は,次の箇所に埋込み変数として使用できます。

オプションについては,「UNIX環境でのプリプロセス」又は「Windows環境でのプリプロセス」のオプションの説明を参照してください。また,構造体を使用できるSQLについては,「プリプロセサの/E2,/E3オプションを指定した場合のポインタ,構造体,及び構造体修飾の使用可否」を参照してください。

(2) 規則

  1. 構造体を埋込み変数として指定すると,プリプロセサは構造体の各メンバが埋込み変数として記述されたとみなして,メンバが個別に記述された場合と同じポストソースを展開します。ポストソース中に展開されるメンバの順序は,構造体のメンバの宣言順序と同じです。構造体が記述されたSQL文の検索項目や列の順序と,メンバの順序は一致している必要があります。

  2. 構造体のメンバを埋込み変数として個別に記述することもできます。

  3. 共用体を含む構造体は使用できません。

  4. 構造体を含む構造体は使用できません。ただし,可変長文字列型,及びBINARY型に対応する構造体は使用できます。

(3) 使用例

構造体の使用例を次に示します。

  struct {
    char    xscode[5];
    char    xsname[17];
    char    xcol[3];
    long    xgryo;
    long    xtanka;
  } xrec;
     :
  EXEC SQL
    DECLARE CR3 CURSOR FOR
      SELECT SCODE,SNAME,COL,ZSURYO, TANKA FROM ZAIKO;
     :
  EXEC SQL OPEN CR3 ;
 
  /*  見出し */
  printf("    *****  在庫表 リスト  *****\n\n");
  printf("    商品コード  商品名            色  単価      現在庫量\n");
  printf("    ----        ----------------  --  --------  --------\n");
 
  EXEC SQL WHENEVER SQLERROR GOTO OWARI;
  EXEC SQL WHENEVER NOT FOUND GOTO OWARI;
 
  /* FETCH */
  for(;;){
    EXEC SQL FETCH CR3 INTO :xrec;
    printf("    %4s      %-16s  %2s  %8d  %8d\n",
        xrec.xscode, xrec.xsname, xrec.xcol, xrec.xtanka, xrec.xgryo);
    }
OWARI:
            :

埋込み変数として構造体を使用する場合に,標識変数も使用するときは,標識変数も構造体で宣言します。標識変数用の構造体の各メンバは,埋込み変数用の構造体の各メンバに,宣言順に対応させます。例を次に示します。

  struct {
      char    xscode[5];
      char    xsname[17];
      char    xcol[3];
      long    xgryo;
      long    xtanka;
  } xrec;
  struct {
      short    xscode_ind;
      short    xsname_ind;
      short    xcol_ind;
      short    xgryo_ind;
      short    xtanka_ind;
  } xrec_ind;
       :
  /* FETCH */
  for(;;){
    EXEC SQL FETCH CR3 INTO :xrec :xrec_ind;
      printf("    %4s      %-16s  %2s  %8d  %8d\n",
         xrec.xscode, xrec.xsname, xrec.xcol, xrec.xtanka, xrec.xgryo);
  }
      :

構造体へのポインタで埋込み変数を指定することもできます。ポインタが指す領域は,あらかじめユーザが確保しておく必要があります。

struct  tag_xrec {
  char    xscode[5];
  char    xsname[17];
  char    xcol[3];
  long    xgryo;
  long    xtanka;
} *xrec_ptr;
struct tag_xrec_ind {
  short    xscode_ind;
  short    xsname_ind;
  short    xcol_ind;
  short    xgryo_ind;
  short    xtanka_ind;
} *xrec_ind_ptr;
      :
/* FETCH */
xrec_ptr = (struct tag_xrec *)malloc(sizeof(struct tag_xrec));
xrec_ind_ptr = (struct tag_xrec_ind *)
                 malloc(sizeof(struct tag_xrec_ind));
  for(;;){
    EXEC SQL FETCH CR3 INTO :xrec_ptr :xrec_ind_ptr;
      printf("    %4s      %-16s  %2s  %8d  %8d\n",
             xrec_ptr->xscode, xrec_ptr->xsname,xrec_ptr->xcol,
             xrec_ptr->xtanka, xrec_ptr->xgryo);
  }
        :