埋め込みSQLプログラムに外部ファイルをインクルードするには、以下を使用します。
EXEC SQL INCLUDE filename;
埋め込みSQLプリプロセッサは、filename.hという名前のファイルを探し、その前処理を行い、最終的にC出力の中に含めます。 このようにして、ヘッダファイル内の埋め込みSQL文が正しく扱われます。
これは以下と異なることに注意してください。
#include <filename.h>
このファイルにはSQLコマンド用前処理が行われません。 当然ながら、他のヘッダファイルをインクルードするCの#includeディレクティブを使用することができます。
注意: 通常のSQLの大文字小文字の区別規則に従うEXEC SQL INCLUDEコマンドの一部であったとしても、インクルードファイルの名前は大文字小文字が区別されます。
Cで既知の#define指示子と同様、埋め込みSQLでも似たような概念を持ちます。
EXEC SQL DEFINE name; EXEC SQL DEFINE name 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プリプロセッサがこの宣言を参照することができないためです。
以下の指示子を使用して、コンパイルするコード部分を選択することができます。
nameを検査し、そのnameがEXEC SQL define nameで作成されていた場合に後続行を処理します。
nameを検査し、そのnameがEXEC SQL define nameで作成されていない場合に後続行を処理します。
EXEC SQL ifdef nameまたはEXEC SQL ifndef nameで導入されたセクションの代替セクションを開始します。
nameを検査し、そのnameがEXEC SQL define nameで作成されている場合に代替セクションを開始します。
代替セクションを終了します。
以下に例を示します。
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;