DECLARE EXTERNAL FUNCTION
Объявление в базе данных функции определённой пользователем (UDF).
DSQL, ESQL
DECLARE EXTERNAL FUNCTION funcname [{ <arg_desc_list> | ( <arg_desc_list> ) }] RETURNS { <return_value> | ( <return_value> ) } ENTRY_POINT 'entry_point' MODULE_NAME 'library_name' <arg_desc_list> ::= <arg_type_decl> [, <arg_type_decl> ...] <arg_type_decl> ::= <udf_data_type> [BY {DESCRIPTOR | SCALAR_ARRAY} | NULL] <udf_data_type> ::= <scalar_datatype> | BLOB | CSTRING(length) [ CHARACTER SET charset ] <return_value> ::= <udf_data_type> { BY VALUE | BY DESCRIPTOR [FREE_IT] | FREE_IT } | PARAMETER param_num <scalar_datatype> ::= См. Синтаксис скалярных типов данных
Параметр | Описание |
---|---|
funcname |
Имя внешней функции.Может содержать до 63 символов. |
entry_point |
Имя экспортируемой функции (точка входа). |
library_name |
Имя модуля, в котором расположена функция. |
sqltype |
Тип данных SQL.Не может быть массивом или элементом массива. |
length |
Максимальная длина нуль терминальной строки.Указывается в байтах. |
charset |
Кодировка строки. |
param_num |
Номер входного параметра, который будет возвращён функцией. |
Оператор DECLARE EXTERNAL FUNCTION
делает доступным внешнюю функцию, определенную пользователем (UDF), в базе данных.Внешние функции должны быть объявлены в каждой базе данных, которая собирается их использовать.Не нужно объявлять UDF, если вы никогда не будете её использовать.
Имя внешней функции должно быть уникальным среди всех имён функций.Оно может отличаться от имени функции указанной в аргументе ENTRY_POINT.
Входные параметры функции перечисляются через запятую сразу после имени функции.Для каждого параметра указывается SQL тип данных.Помимо SQL типов можно указать тип CSTRING
.В этом случае параметр является нуль терминальной строкой с максимальной длиной length байт.Существует несколько механизмов передачи параметра из движка Firebird во внешнюю функцию, каждый из этих механизмов будет рассмотрен отдельно.
По умолчанию входные параметры передаются по ссылке.Не существует отдельного предложения для явного указания, что параметр передаётся по ссылке.
При передаче NULL
значения по ссылке оно преобразуется в эквивалент нуля, например, число 0 или пустую строку.Если после указанного параметра указано ключевое слово NULL
, то при передаче значение NULL
оно попадёт в функцию в виде нулевого указателя (NULL).
Note
|
Обратите внимание на то, что объявление функции с ключевым словом NULL не гарантирует вам, что эта функция правильно обработает входной параметр со значением NULL.Любая функция должна быть написана или переписана таким образом, чтобы правильно обрабатывать значения NULL.Всегда смотрите и используйте объявления функции, предоставленные её разработчиком. |
Если указано предложение BY DESCRIPTOR
, то входной параметр передаётся по дескриптору.В этом случае параметр UDF получит указатель на внутреннюю структуру, известную как дескриптор, несущую информацию о типе данных, подтипе, точности, наборе символов и сортировке, масштабе, указателе на сами данные и некоторых флагах, в том числе NULL индикаторе.Отметим, что это объявление работает только в том случае, если внешняя функция написана с использованием дескриптора.
Warning
|
При передаче параметра функции по дескриптору передаваемое значение не приводится к задекларированному типу данных. |
Предложение BY SCALAR_ARRAY
используется при передаче массивов в качестве входных параметров.В отличие от других типов, вы не можете вернуть массив из UDF.
Обязательное предложение RETURNS
описывает выходной параметр возвращаемый функцией.Функция всегда возвращает только один параметр.Выходной параметр может быть любым SQL типом (кроме массива и элемента массива) или нуль терминальной строкой (CSTRING
).
Выходной параметр может быть передан по ссылке, по дескриптору или по значению.По умолчанию выходной параметр передаётся по ссылке.Если указано предложение BY DESCRIPTOR
, то выходной параметр передаётся по дескриптору.Если указано предложение BY VALUE
, то выходной параметр передаётся по значению.
Ключевое слово PARAMETER
указывает, что функция возвращает значение из параметра с номером param_num.Такая необходимость возникает, если необходимо возвращать значение типа BLOB.
Ключевое слово FREE_IT
означает, что память, выделенная для хранения возвращаемого значения, будет освобождена после завершения выполнения функции.Применяется только в том случае, если эта память в UDF выделялась динамически.В такой UDF память должна выделяться при помощи функции ib_util_malloc из модуля ib_util.Это необходимо для совместимости функций выделения и освобождения памяти используемого в коде Firebird и коде UDF.
Предложение ENTRY_POINT
указывает имя точки входа (имя экспортируемой функции) в модуле.
Предложение MODULE_NAME
задаёт имя модуля, в котором находится экспортируемая функция.В ссылке на модуль может отсутствовать полный путь и расширение файла.Это позволяет легче переносить базу данных между различными платформами.По умолчанию динамические библиотеки пользовательских функций должны располагаться в папке UDF корневого каталога сервера.Параметр UDFAccess
в файле firebird.conf позволяет изменить ограничения доступа к библиотекам внешних функций.