ecpg
プリプロセッサがファイルを解析および処理する方法を変更することができる、プリプロセッサ指示子が複数あります。
埋め込みSQLプログラムに外部ファイルをインクルードするには、以下を使用します。
EXEC SQL INCLUDEfilename
; EXEC SQL INCLUDE <filename
>; EXEC SQL INCLUDE "filename
";
埋め込みSQLプリプロセッサは、
という名前のファイルを探し、その前処理を行い、最終的にC出力の中に含めます。
このようにして、ヘッダファイル内の埋め込みSQL文が正しく扱われます。
filename
.h
ecpg
プリプロセッサは以下の順番で複数のディレクトリからファイルを検索します。
/usr/local/include
/usr/local/pgsql/include
)/usr/include
しかしEXEC SQL INCLUDE "
が使われる場合、現在のディレクトリのみが検索されます。
filename
"
各ディレクトリの中で、プリプロセッサはまず指定されたファイル名を探します。
見つからなければ(指定されたファイル名がこの接尾辞を持っていない限り)ファイル名に.h
を付けて再検索します。
EXEC SQL INCLUDE
は以下とは異なることに注意してください。
#include <filename
.h>
このファイルにはSQLコマンド用前処理が行われないためです。
当然ながら、他のヘッダファイルをインクルードするCの#include
ディレクティブを使用することができます。
通常のSQLの大文字小文字の区別規則に従うEXEC SQL INCLUDE
コマンドの一部であったとしても、インクルードファイルの名前は大文字小文字が区別されます。
Cで既知の#define
指示子と同様、埋め込みSQLでも似たような概念を持ちます。
EXEC SQL DEFINEname
; EXEC SQL DEFINEname
value
;
このため、以下のように名前を定義することができます。
EXEC SQL DEFINE HAVE_FEATURE;
また、定数を定義することもできます。
EXEC SQL DEFINE MYNUMBER 12; EXEC SQL DEFINE MYSTRING 'abc';
事前の定義を削除するにはundef
を使用します。
EXEC SQL UNDEF MYNUMBER;
当然、Cの#define
や#undef
を埋め込みSQLプログラムで使用することは可能です。
違いは宣言した値がどこで評価されるかです。
EXEC SQL DEFINE
を使用する場合、ecpg
プリプロセッサがその定義を評価し、その値を置換します。
例えば、
EXEC SQL DEFINE MYNUMBER 12; ... EXEC SQL UPDATE Tbl SET col = MYNUMBER;
と記載した場合、ecpg
による置換がすでに行われていますので、CコンパイラではMYNUMBER
という名前や識別子を参照することはありません。
埋め込みSQL問い合わせで使用する予定の定数に#define
を使用することはできませんので注意してください。
この場合、埋め込みSQLプリプロセッサがこの宣言を参照することができないためです。
以下の指示子を使用して、コンパイルするコード部分を選択することができます。
EXEC SQL ifdef name
;
name
を検査し、そのname
がEXEC SQL define
で作成されていた場合に後続の行を処理します。
name
EXEC SQL ifndef name
;
name
を検査し、そのname
がEXEC SQL define
で作成されていない場合に後続の行を処理します。
name
EXEC SQL else;
EXEC SQL ifdef
またはname
EXEC SQL ifndef
で導入されたセクションの代替セクションを開始します。
name
EXEC SQL elif name
;
name
を検査し、そのname
がEXEC SQL define
で作成されている場合に代替セクションを開始します。
name
EXEC SQL endif;
代替セクションを終了します。
以下に例を示します。
EXEC SQL ifndef TZVAR; EXEC SQL SET TIMEZONE TO 'GMT'; EXEC SQL elif TZNAME; EXEC SQL SET TIMEZONE TO TZNAME; EXEC SQL else; EXEC SQL SET TIMEZONE TO TZVAR; EXEC SQL endif;