8.2.7 構造体の参照
(1) 概要
オプションを指定すると,C言語の構造体を使用して,複数個の埋込み変数を一度に指定できます。
構造体は,次の箇所に埋込み変数として使用できます。
-
1行SELECT文又はFETCH文のINTO句
-
INSERT文のVALUES句
-
EXECUTE文のUSING句又はINTO句
オプションについては,「UNIX環境でのプリプロセス」又は「Windows環境でのプリプロセス」のオプションの説明を参照してください。また,構造体を使用できるSQLについては,「プリプロセサの/E2,/E3オプションを指定した場合のポインタ,構造体,及び構造体修飾の使用可否」を参照してください。
(2) 規則
-
構造体を埋込み変数として指定すると,プリプロセサは構造体の各メンバが埋込み変数として記述されたとみなして,メンバが個別に記述された場合と同じポストソースを展開します。ポストソース中に展開されるメンバの順序は,構造体のメンバの宣言順序と同じです。構造体が記述されたSQL文の検索項目や列の順序と,メンバの順序は一致している必要があります。
-
構造体のメンバを埋込み変数として個別に記述することもできます。
-
共用体を含む構造体は使用できません。
-
構造体を含む構造体は使用できません。ただし,可変長文字列型,及び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); } :