7.2.1 記述規則
UAPを作成するとき,SQLの文法の規則以外に,名標の付け方やSQLの記述についての規則があります。
- 〈この項の構成〉
(1) 名標の付け方の規則
名標を付ける場合,基本的にC言語の規則に従います。
C言語の規則以外に,使用できない名標を次に示します。
-
大文字の「SQL」で始まる名標
-
小文字の「p_ 」で始まる名標
-
小文字の「pd」で始まる名標
-
大文字の「PD」で始まる名標
なお,SQL中で使用する埋込み変数,標識変数,及び分岐先ラベルの名称の付け方は,名標の付け方,及びC言語の規則に従います。
(2) SQLの記述規則
-
SQLは,一つのSQL文ごとにSQL先頭子(EXEC SQL)とSQL終了子(;)とで囲みます。
<正しい指定例>
EXEC SQL SQL文 ;
-
埋込みSQL文,又はその一部にC言語のマクロ機能を使用できません。
<誤った指定例>
#define X USER.MEMBER EXEC SQL SELECT NAME INTO :MANNAME FROM X;
注 部分が誤りです。
-
SQLの予約語は,大文字でも小文字でも使用できます。
<指定例1>
EXEC SQL SELECT MEM INTO :NAME FROM TABLE;
<指定例2>
exec sql select MEM into :NAME from TABLE;
<指定例3>
exec SQL SELECT MEM Into :NAME From TABLE;
-
SQL先頭子,埋込みSQL開始宣言,及び埋込みSQL終了宣言は,各1行で記述します。また,各々を構成する字句を区切るため,半角空白文字を挿入します。
なお,改行文字の次の文字から次の改行文字までの文字列が1行です。ただし,プリプロセスするUAPのソースプログラムは,1行の長さが32000文字を超える記述ができないので,1行の長さを32000文字以内にしてください。
<正しい指定例>
EXEC SQL BEGIN DECLARE SECTION; : EXEC SQL END DECLARE SECTION; EXEC SQL SELECT ... ;
<誤った指定例>
EXEC SQL BEGIN DECLARE SECTION; : EXEC SQL END DECLARE SECTION; EXEC \ SQL SELECT ... ;
注 部分が誤りです。
-
埋込みSQL宣言節の定義は,埋込み変数,又は標識変数を使用するSQLよりも前に宣言します。
<指定例>
EXEC SQL BEGIN DECLARE SECTION; short URIAGE; EXEC SQL END DECLARE SECTION; : EXEC SQL SELECT KINGAKU INTO :URIAGE FROM TABLE;
-
埋込み変数,及び標識変数を指定する場合,次の規則に従います。
-
宣言文は複数行にわたって記述できます。また,同じ行に二つ以上の定義文を記述することもできます。
<指定例>
short URIAGE, SURYO; short URIAGE; short SURYO;
-
埋込みSQL宣言節内で記述できる項目を次の表に示します。
表7‒1 埋込みSQL宣言節内で記述できる項目 記述する項目
埋込み宣言節内での記述
注釈
○
C言語の命令文
×
C言語の制御文
×
SQL文
×
埋込み変数宣言
○
標識変数宣言
○
- (凡例)
-
○:記述できます。
×:記述できません。
-
一つのソースファイル内では,同一名称の埋込み変数,及び標識変数を二つ以上宣言できません。
-
一つの宣言文で複数の埋込み変数,又は標識変数を宣言できます。
<指定例>
short URIAGE, SURYO ; 埋込み変数の宣言 short XURIAGE, XSURYO ; 標識変数の宣言
-
埋込み変数に使用できるデータ型については,「SQLのデータ型とデータ記述」を参照してください。
-
-
関数内で宣言した埋込み変数はローカル変数になり,関数外で宣言した埋込み変数はグローバル変数になります。
-
関数ブロック内でC言語の命令文を記述できる箇所には,埋込みSQL文も記述できますが,ほかのSQL文,及びC言語で記述した文と同じ行には記述できません。
なお,ラベルはSQL先頭子の前に付けることができます。
SQL文を記述できる箇所を次の表に示します。
表7‒2 SQL文を記述できる箇所 同一行内の記述箇所
SQL文の記述
C言語と命令文
前
×
中
×
後
×
C言語制御文
前
×
中
×
後
×
ラベル
前
×
後
○
注釈
前
○
中
×
後
○
SQL文※
前
×
中
×
後
×
- (凡例)
-
○:記述できます。
×:記述できません。
- 注※
-
SQL先頭子で始まり,SQL終了子で終わることを前提にします。
-
VisualC++コンパイラでMFC(MicrosoftFoundationClass)用ヘッダファイル(AFXxxxxx.H)をHiRDBのUAPソースにインクルードする場合,次のSQL文でMFC用ヘッダファイルより後にHiRDBのヘッダファイルをインクルードしてください。HiRDBが提供するヘッダファイルを,このSQL文を記述した箇所でインクルードします。
EXEC SQL INCLUDE HIRDB_HEADERS ;
-
INCLUDE HIRDB_HEADERSは,ポストソースの先頭で自動的にインクルードしていたHiRDBのヘッダファイルを,指定した箇所でインクルードするものです。
-
INCLUDE HIRDB_HEADERSは,C言語,及びC++言語でだけ使用できます。ほかの言語では使用できません。
-
INCLUDE HIRDB_HEADERSは,UAP中で一回だけ使用できます。
-
INCLUDE HIRDB_HEADERSを使用しない場合,ポストソースの先頭にHiRDBのヘッダファイルがインクルードされます。
VisualC++が提供しているMFC用のヘッダファイルには,インクルードする順番に順序関係があり,WINDOWS.Hヘッダファイル(HiRDBが使用しているヘッダファイル)が先にインクルードされているとエラーになることがあります。この場合,INCLUDE HIRDB_HEADERSを使用してください。
HiRDBは,次のVisualC++のヘッダファイルを使用しています。
-
WINDOWS.H
-
STRING.H
INCLUDE HIRDB_HEADERSの使用例を次に示します。
#include <afx.h> EXEC SQL INCLUDE HIRDB_HEADERS ;
-
-
注釈の規則を次に示します。
-
SQL先頭子からSQL終了子までの間に記述した囲み注釈(/*〜*/)及び単純注釈(-- 〜 改行)はSQLプリプロセサが削除します。ただし,SQL最適化指定(/*>>〜<<*/)は削除しないで,SQL文として扱います。また,引用符(")やアポストロフィ(')で囲まれた部分にある「/*〜*/」及び「--〜改行」は削除しません。
-
プリプロセスオプション-Xs又は/Xsを指定した場合にだけ,SQL先頭子からSQL終了子までの間に単純注釈を記述できます。
-
単純注釈とSQL終了子を同じ行に記述することはできません。
<単純注釈の正しい指定例>
EXEC SQL -- 注釈1 CALL PROC1(0) -- 注釈2 ;
<単純注釈の誤った指定例1>
EXEC SQL CALL PROC1(0) -- 注釈1 ;
この場合,単純注釈の中にセミコロン(;)があるため,セミコロンがSQL終了子としてみなされません。
<単純注釈の誤った指定例2>
EXEC SQL CALL PROC1(0) ; -- 注釈1
この場合,「-- 〜 改行」がSQL先頭子からSQL終了子(;)の範囲外にあるため,「-- 〜 改行」が注釈としてみなされません。
SQL文中での囲み注釈,単純注釈,及びSQL最適化指定については,マニュアル「HiRDB SQLリファレンス」を参照してください。
-
-
\記号での行の継続は使用できません。
-
-E又は/Eオプションを使用すると,Cコンパイラのプリプロセサ宣言文が有効となるため,#ifdefでのSQL文の切り替えができ,また,埋込みSQL宣言節の定数をマクロ定数で記述できます。ただし,次の制限があります。
-
SQL先頭子からSQL終了子までの間に,プリプロセサ宣言文を記述できません。
-
SQL先頭子とSQL終了子のカラム位置が変わるマクロは使用できません。
-
SQL先頭子,及びSQL終了子のマクロ定義はできません。
-
-
-E又は/Eオプションを使用すると,C言語の文法に従って宣言された,SQLのデータ型に対応した変数であれば,埋込みSQL宣言節で埋込み変数を宣言しなくても,埋込み変数を使用できます。同じ名称の変数がある場合は,C言語の文法に従って,それぞれの変数の有効範囲を判定します。ただし,次の制限があります。
-
変数名は,先頭から63文字までが区別されます。64文字目以降は区別されません。なお,ユニバーサル文字名(\uxxxxと\Uxxxxxxxx)は1文字としてカウントされます。
-
ネストした構造体は使用できません。
-
宣言文の中で,添字に式を使用している埋込み変数は使用できません。
-
const型の埋込み変数は,入力用の変数としてだけ使用できます。
-
変数名,関数名などのC言語の識別子として,大文字,小文字に関係なく「varchar」は使用できません。
-
-
-E又は/Eオプションを使用すると,複数個の埋込み変数をメンバとして持つ構造体を,埋込み変数として宣言できます。すべてのメンバは,SQLのデータ型に対応した形式でなければなりません。構造体の中に,構造体及び共用体を含めることはできません。ただし,可変長文字列型,及びBINARY型に対応する構造体は使用できます。
-
-E又は/Eオプションを使用すると,ポインタを埋込み変数として宣言できます。宣言の形式はC言語の文法に従います。SQL文中で使用する場合は,埋込み変数名の前にアスタリスクを付けないで,通常の埋込み変数と同じ形式で記述します。
-
-E又は/Eオプションを使用すると,構造体のメンバを埋込み変数として明示的に指定する場合は,構造体名で修飾して":構造体.メンバ名"と記述します。構造体へのポインタを使用する場合は,ポインタで修飾して":ポインタ名->メンバ名"と記述します。
-
Windows版の場合に/Eオプションを指定したときは,次の制限があります。
-
typedefで,同じtypedef名を二回定義しても構文エラーになりませんが,定義内容が同じかどうかのチェックはされません。
-
匿名構造体のメンバは,埋込み変数として使用できません。
-
記憶クラス,及びデータ型なしで記述した宣言子は,埋込み変数として使用できません。
-
-
-E又は/Eオプション指定時にも,SQLのCOPY文を使用できます。COPY文を使用できる条件については,表「プリプロセスオプション(UNIX環境のC言語の場合)」又は表「プリプロセスオプション(Windows環境のC言語の場合)」を参照してください。
-
可変長配列は,埋込み変数として使用できません。
-
-E又は/Eオプション指定時には,2文字表記「<:」,「<%」など,及び3文字表記「??(」,「??=」などの文字は使用できません。また,-E又は/Eオプションを指定しない場合でも,SQL文と埋込みSQL宣言節では使用できません。使用すると,通常の文字として扱われます。
-
-E又は/Eオプション指定時には,次に示すCの標準規格(C99)に規定されていない予約語を使用できます。
用途
処理
環境※1
予約語
型修飾子,又は型指定子※2
構文解析で型修飾子,又は型指定子として扱われる。
Windows
__int8,__int16,__int32,__int64,_int8,_int16,_int32,_int64
UNIX
__volatile__,__builtin_va_list,__complex__,__signed__
その他
構文解析で意味のない語句として扱うため無視される。
Windows
__based,__cdecl,__export,__far,__fastcall,__forceinline,__inline,__near,__pascal,__ptr32,__ptr64,__stdcall,__unaligned,__w64,_based,_cdecl,_export,_far,_fastcall,_forceinline,_inline,_near,_pascal,_stdcall__declspec,__pragma,_declspec__try,__except,__finally__asm,_asm
UNIX
__const,__const__,__extension__,__inline,__inline__,__restrict,__attribute__,__asm__
- 注※1
-
Windows環境の予約語は,Visual C++で使用されるものです。2文字の下線(__)で始まる予約語は,VisualC++6.0以降で定義されているものです。下位バージョンのVisual C++で作成したソースのために,1文字の下線(_)で始まる場合も含めます。
UNIX環境の予約語は,gccで使用されるものです。
- 注※2
-
型修飾子,又は型指定子として扱う予約語は,埋込み変数の宣言には使用できません。
-
-E又は/Eオプション指定時には,ビットフィールドは任意の整数型として宣言できます。ただし,ビットフィールドは埋込み変数の宣言には使用できません。
-
ソースにヘッダファイルを引き込む方法として,#includeとSQLのCOPY文があります。それぞれヘッダファイル中に記述できる項目を次に示します。
項番
記述項目
ヘッダファイルを引き込む方法
#include
COPY文
1
SQL文
COPY
×
×
2
COPY以外
×
○
3
埋込み変数宣言
「SQL TYPE IS」で始まる
×
○
4
「VARCHAR」で始まる
×
○
5
「CHARACTER SET」を含む
×
○
6
C言語による変数宣言※
△
○
7
標識変数宣言
△
○