Системные таблицы InterBase - Функции

ОГЛАВЛЕНИЕ


Функции

Функции позволяют наращивать возможности InterBase-сервера за счет подключения к базе данных модулей из dll, которые могут быть реализованы на любом языке программирования. Прежде чем пользоваться функциями, давайте сначала узнаем, а какие функции декларированы в базе данных. Основная информация о функциях находится в таблицах RDB$FUNCTIONS и RDB$FUNCTION_ARGUMENTS.

  select rdb$function_name
from rdb$functions
where ((rdb$system_flag = 0) or (rdb$system_flag is null));

Этот запрос вернет Вам список всех декларированных функций. Но это только список. Давайте посмотрим, где находятся эти функции и под каким именем их вызывать из библиотек.

  select RDB$FUNCTION_NAME, RDB$MODULE_NAME,
RDB$ENTRYPOINT, RDB$RETURN_ARGUMENT
from rdb$functions
where ((rdb$system_flag = 0) or (rdb$system_flag is null));

Приведенный выше запрос возвращает, кроме наименования функции, под которым она известна в базе данных, наименование модуля, точку входа (наименование в модуле), позицию аргумента, возвращаемого программе вызова. Сами аргументы функции содержаться в таблице RDB$FUNCTION_ARGUMENTS. Покажем, как можно узнать, какие аргументы имеет некоторая функция.

   SELECT a.RDB$FUNCTION_NAME, b.RDB$ARGUMENT_POSITION,
b.RDB$MECHANISM, b.RDB$FIELD_TYPE,
b.RDB$FIELD_SCALE, b.RDB$FIELD_LENGTH, b.RDB$FIELD_SUB_TYPE
FROM RDB$FUNCTIONS a, RDB$FUNCTION_ARGUMENTS b
WHERE (a.RDB$FUNCTION_NAME = b.RDB$FUNCTION_NAME) and
((a.RDB$SYSTEM_FLAG = 0) OR (a.RDB$SYSTEM_FLAG IS NULL))
and (b.RDB$ARGUMENT_POSITION<>a.RDB$RETURN_ARGUMENT);

Этот запрос возвратит для кажной функции информацию о входных аргументах (их порядок, механизм передачи, о котором можно почитать в документации, а далее уже известные вещи: тип, длина и т.д.). Условие (b.RDB$ARGUMENT_POSITION <> a.RDB$RETURN_ARGUMENT) отбирает только входные аргументы. Если нужно посмотреть выходные аргументы, то можно воспользоваться следующим запросом.

   SELECT a.RDB$FUNCTION_NAME, b.RDB$ARGUMENT_POSITION,
b.RDB$MECHANISM, b.RDB$FIELD_TYPE,
b.RDB$FIELD_SCALE , b.RDB$FIELD_LENGTH, b.RDB$FIELD_SUB_TYPE
FROM RDB$FUNCTIONS a, RDB$FUNCTION_ARGUMENTS b
WHERE (a.RDB$FUNCTION_NAME = b.RDB$FUNCTION_NAME) and
((a.RDB$SYSTEM_FLAG = 0) OR (a.RDB$SYSTEM_FLAG IS NULL))
and (b.RDB$ARGUMENT_POSITION = a.RDB$RETURN_ARGUMENT);