×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

4.3.9. Директивы препроцессора

4.3.9.1. Включение файлов
4.3.9.2. Директивы define и undef
4.3.9.3. Директивы ifdef, ifndef, elif, else и endif

Доступно несколько директив препроцессора, которые изменяют то, каким образом ecpg препроцессор анализирует и обрабатывает файл.

4.3.9.1. Включение файлов #

Чтобы включить внешний файл в программу с внедренным SQL, используйте команду:

EXEC SQL INCLUDE имя_файла;
EXEC SQL INCLUDE <имя_файла>;
EXEC SQL INCLUDE "имя_файла";

Препроцессор внедренного SQL выполнит поиск файла с именем имя_файла.h, обработает его и включит в результирующий код на языке C. Таким образом, операторы внедренного SQL во включенном файле обрабатываются корректно.

Данный ecpg препроцессор будет искать файл в нескольких каталогах в следующем порядке:

  • текущий каталог
  • /usr/local/include
  • каталог заголовочных файлов PostgreSQL, определенный при сборке (например, /usr/local/pgsql/include)
  • /usr/include

Однако когда EXEC SQL INCLUDE "имя_файла" используется, поиск выполняется только в текущем каталоге.

В каждом каталоге препроцессор сначала ищет файл с указанным именем, и, если он не найден, добавляет расширение .h к имени файла и пробует снова (за исключением случаев, когда указанное имя файла уже имеет этот суффикс).

Обратите внимание, что EXEC SQL INCLUDE имеет значение не то же самое, что и:

#include <имя_файла.h>

потому что этот файл не будет подвергнут предварительной обработке SQL-команд. Естественно, вы можете продолжать использовать директиву C #include для включения других заголовочных файлов.

Примечание

Имя включаемого файла чувствительно к регистру, даже несмотря на то, что остальная часть EXEC SQL INCLUDE команды следует обычным правилам SQL в отношении регистра символов.

4.3.9.2. Директивы define и undef #

Аналогично директиве #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 параметров в командной строке.

4.3.9.3. Директивы ifdef, ifndef, elif, else и endif #

Для условной компиляции разделов кода можно использовать следующие директивы:

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;

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению