8.2.5 埋込みSQL宣言節の不要化
(1) 概要
プリプロセサでは,/Eオプション(UNIX版の場合は-Eオプション)を指定すると,UAPソースファイル中の任意の箇所で宣言されているSQLのデータ型に対応した変数を,埋込み変数として使用できます。ただし,register記憶クラスの変数は,埋込み変数として使用できません。
変数の有効範囲は,UAPソースファイルを記述しているホスト言語の規則に従います。この機能を使用できるのは,C言語又はCOBOL言語でUAPソースファイルを記述している場合だけです。
この機能を使用すると,次のことができます。
-
変数宣言を,埋込みSQL開始宣言(BEGIN DECLARE SECTION)及び埋込みSQL終了宣言(END DECLARE SECTION)で囲まなくても,埋込み変数として使用できます。また,併用もできます。
-
大域変数,局所変数,及び関数の引数の有効範囲を,ホスト言語の文法に従って判定します。埋込み変数の有効範囲が異なれば,同じ名称の変数を宣言しても,異なる埋込み変数として区別されます。この場合,その変数を使用しているSQL文を含む最も内側の変数が指定されたとみなされます。
(2) 使用例
使用例を次に示します。
int fetchdata(long xtanka){ char xscode[5]; char xsname[17]; char xcol[3]; long xgryo; : EXEC SQL DECLARE CR3 CURSOR FOR SELECT SCODE,SNAME,COL,ZSURYO FROM ZAIKO WHERE TANKA=:xtanka; : 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 :xscode,:xsname,:xcol,:xgryo; printf(" %4s %-16s %2s %8d %8d\n", xscode, xsname, xcol, xtanka, xgryo); } } OWARI: