Заметки о системных таблицах 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);



Содержание раздела