★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

34.9. プリプロセッサ指示子

ecpgプリプロセッサがファイルを解析および処理する方法を変更することができる、プリプロセッサ指示子が複数あります。

34.9.1. ファイルのインクルード

埋め込みSQLプログラムに外部ファイルをインクルードするには、以下を使用します。

EXEC SQL INCLUDE filename;
EXEC SQL INCLUDE <filename>;
EXEC SQL INCLUDE "filename";

埋め込みSQLプリプロセッサは、filename.hという名前のファイルを探し、その前処理を行い、最終的にC出力の中に含めます。 このようにして、ヘッダファイル内の埋め込みSQL文が正しく扱われます。

ecpgプリプロセッサは以下の順番で複数のディレクトリからファイルを検索します。

  • カレントディレクトリ
  • /usr/local/include
  • ビルド時に設定されたPostgreSQLのインクルードディレクトリ (例えば、/usr/local/pgsql/include)
  • /usr/include

しかしEXEC SQL INCLUDE "filename"が使われる場合、現在のディレクトリのみが検索されます。

各ディレクトリの中で、プリプロセッサはまず指定されたファイル名を探します。 見つからなければ(指定されたファイル名がこの接尾辞を持っていない限り)ファイル名に.hを付けて再検索します。

EXEC SQL INCLUDEは以下とは異なることに注意してください。

#include <filename.h>

このファイルにはSQLコマンド用前処理が行われないためです。 当然ながら、他のヘッダファイルをインクルードするCの#includeディレクティブを使用することができます。

注記

通常のSQLの大文字小文字の区別規則に従うEXEC SQL INCLUDEコマンドの一部であったとしても、インクルードファイルの名前は大文字小文字が区別されます。

34.9.2. defineおよびundef指示子

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プリプロセッサがこの宣言を参照することができないためです。

34.9.3. ifdef、ifndef、else、elif、endif指示子

以下の指示子を使用して、コンパイルするコード部分を選択することができます。

EXEC SQL ifdef name;

nameを検査し、そのnameEXEC SQL define nameで作成されていた場合に後続の行を処理します。

EXEC SQL ifndef name;

nameを検査し、そのnameEXEC SQL define nameで作成されていない場合に後続の行を処理します。

EXEC SQL else;

EXEC SQL ifdef nameまたはEXEC SQL ifndef nameで導入されたセクションの代替セクションを開始します。

EXEC SQL elif name;

nameを検査し、そのnameEXEC 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;