Доступно несколько директив препроцессора, которые изменяют то, каким образом ecpg препроцессор анализирует и обрабатывает файл.
Чтобы включить внешний файл в программу с внедренным SQL, используйте команду:
EXEC SQL INCLUDEимя_файла; EXEC SQL INCLUDE <имя_файла>; EXEC SQL INCLUDE "имя_файла";
Препроцессор внедренного SQL выполнит поиск файла с именем
,
обработает его и включит в результирующий код на языке C. Таким образом, операторы внедренного SQL во включенном файле обрабатываются корректно.
имя_файла.h
Данный ecpg препроцессор будет искать файл в нескольких каталогах в следующем порядке:
/usr/local/include/usr/local/pgsql/include)/usr/include
Однако когда EXEC SQL INCLUDE
" используется, поиск выполняется только в текущем каталоге.
имя_файла"
В каждом каталоге препроцессор сначала ищет файл с указанным именем, и, если он не найден, добавляет расширение .h
к имени файла и пробует снова (за исключением случаев, когда указанное имя файла
уже имеет этот суффикс).
Обратите внимание, что EXEC SQL INCLUDE имеет значение не то же самое, что и:
#include <имя_файла.h>
потому что этот файл не будет подвергнут предварительной обработке SQL-команд.
Естественно, вы можете продолжать использовать директиву C
#include для включения других заголовочных файлов.
Имя включаемого файла чувствительно к регистру, даже несмотря на то, что остальная часть EXEC SQL INCLUDE команды следует обычным правилам SQL в отношении регистра символов.
Аналогично директиве #define известной в языке C,
внедренный SQL использует схожую концепцию:
EXEC SQL DEFINEимя; EXEC SQL DEFINEимя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. Обратите внимание, что вы не можете использовать
#define для константы, которую планируется использовать во внедренном SQL-запросе, так как в этом случае прекомпилятор внедренного SQL не сможет увидеть это объявление.
Если в командной строке препроцессора указано несколько входных файлов, действия ecpg
препроцессора и эффекты EXEC SQL
DEFINE и EXEC SQL UNDEF не переносятся между файлами: каждый файл начинается только с символов, определенных -D параметров в командной строке.
Для условной компиляции разделов кода можно использовать следующие директивы:
EXEC SQL ifdef имя; #
Проверяет наличие идентификатора и имя обрабатывает последующие строки, если он
имя был определен с помощью EXEC SQL define
.
имя
EXEC SQL ifndef имя; #
Проверяет наличие идентификатора и имя обрабатывает последующие строки, если он
имя не не был определен с помощью
EXEC SQL define .
имя
EXEC SQL elif имя; #
Начинает необязательную альтернативную секцию после
EXEC SQL ifdef или
имяEXEC SQL ifndef
директивы. Любое количество имяelif может присутствовать в коде.
Строки, следующие за elif будут обработаны,
если имя был
определен и ни одна из предыдущих секций этой же
ifdef/ifndef...endif
конструкции не была обработана.
EXEC SQL else; #
Начинает необязательную финальную альтернативную секцию после
EXEC SQL ifdef или
имяEXEC SQL ifndef
директивы. Последующие строки будут обработаны, если ни одна из предыдущих секций
этой же
имяifdef/ifndef...endif
конструкции не была обработана.
EXEC SQL endif; #
Завершает
ifdef/ifndef...endif
конструкцию. Последующие строки обрабатываются в обычном режиме.
ifdef/ifndef...endif
конструкции могут быть вложенными, глубиной до 127 уровней.
В данном примере будет скомпилирована ровно одна из трех SET
TIMEZONE команд:
EXEC SQL ifdef TZVAR; EXEC SQL SET TIMEZONE TO TZVAR; EXEC SQL elif TZNAME; EXEC SQL SET TIMEZONE TO TZNAME; EXEC SQL else; EXEC SQL SET TIMEZONE TO 'GMT'; EXEC SQL endif;