Чтение онлайн

на главную - закладки

Жанры

Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Борри Хелен

Шрифт:

SELECT

'MKTPR-1994' AS PROJECT,

SUM(PROJECTED_BUDGET) AS TOTAL_BUDGET

FROM PROJ_DEPT_BUDGET

WHERE PROJ_ID = 'MKTPR' AND FISCAL_YEAR = 1994;

Выходом будет одна строка: строковое поле времени выполнения и вычисленный итог.

Внешние функции (UDF)

Внешние функции являются вспомогательными программами, написанными на языке программирования, таком как С, C++ или Pascal, и скомпилированными как совместно используемые двоичные библиотеки- DLL в Windows или совместно используемые объекты для других платформ, которые поддерживают динамическую загрузку. Как и стандартные встроенные функции SQL, внешние функции могут быть разработаны для выполнения преобразований или вычислений, реализация которых либо слишком сложна,

либо вовсе невозможна средствами языка SQL.

Вы можете использовать внешние функции, используя их в выражениях, так же, как вы используете встроенные функции SQL. Как и внутренние функции, они могут возвращать значения для переменных или выражений SQL в хранимых процедурах и триггерах.

Фрагмент "определенные пользователем" в названии функций означает, что вы можете писать свои собственные функции. Возможности создания пользовательских функций для вашего сервера Firebird ограничиваются лишь вашей изобретательностью и умением программировать на включающем языке. Допустимо включение статистических, строковых, математических функций, функций даты, подпрограмм форматирования данных и даже пользовательского процессора для выполнения регулярных выражений (regular expression, regexes).

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

Существующие библиотеки

Firebird поставляется с двумя предварительно встроенными библиотеками внешних функций. Библиотеки совместно используемых объектов размещаются по умолчанию в каталоге /UDF корневого каталога Firebird. Расширения файлов:

* dll - для Windows;

* so - для других поддерживаемых платформ.

Библиотека ib udf- библиотека полезных базовых функций- наследуется Firebird от своего предшественника InterBase. Она нужна для вызова некоторых утилит управления памятью, которые находятся в совместно используемом объекте с именем ib utii, размещенном в каталоге /bin. Эта библиотека передает параметры по значению или по ссылке в согласованном стиле InterBase. В некоторых подпрограммах исправлены ошибки для Firebird, так что не используйте версии, поставляемые с продуктами Borland.

Библиотеку fbudf создал Клавдио Валдеррама (Claudio Valderrama). Она передает параметры через дескрипторы Firebird, что является наиболее надежным способом гарантировать отсутствие внутренних ошибок в результате выделения памяти и преобразования типов.

Свободно доступными также являются некоторые библиотеки UDF, включая библиотеку FreeUDFLib, вначале написанную Грегори Диц (Gregory Deatz) для Borland Delphi. Библиотека FreeUDFLib содержит большое количество функций для строк, математических операций, типов данных BLOB и даты. Она поддерживалась, корректировалась и дополнялась разными людьми в течение многих лет. Будьте внимательны при получении версии этой библиотеки, которая правильно работает в диалекте 3 с типами данных даты и времени. Такая версия для Windows доступна наИсходный код на С для версии POSIX доступен как FreeUDFLibC, однако на момент написания этой главы не было надежного бинарного кода, доступного для загрузки.

Конфигурация и вопросы безопасности

Коды внешних модулей являются по своей сути уязвимыми для злоумышленников и небрежных администраторов. Как-никак это просто файлы файловой системы.

В Firebird 1.0.x вы можете- и должны- явно сконфигурировать положение библиотек внешних функций на сервере, используя параметр externai_function_directory в файле конфигурации (isc config для серверов POSIX и ibconfig для Windows). Это следует сделать администратору базы данных для обеспечения того, что библиотеки не будут перезаписаны - случайно или неавторизованными посетителями.

В Firebird 1.5 и выше доступ к внешним файлам разного вида может быть ограничен на различных уровнях доступа. По умолчанию, если вы решите разместить библиотеки внешних функций в каталогах не по умолчанию, они будут недоступны для сервера. Просмотрите замечания в главе 36 относительно конфигурирования параметра uDFAccess в файле firebird.conf для разрешения подобных проблем.

Устойчивость

Некорректная UDF

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

Объявление функции для базы данных

Когда UDF написана, скомпилирована, тщательно протестирована и инсталлирована в соответствующий каталог на сервере, она должна быть объявлена для базы данных, чтобы ее можно было использовать как функцию SQL. Для этого используйте оператор DDL DECLARE EXTERNAL FUNCTION. Вы можете объявить функции с использованием isql, любого другого интерактивного инструмента SQL или скрипта.

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

Объявление функции для базы данных информирует эту базу данных относительно:

* имени, с которым функция будет использована в операторах SQL. В объявлении вы можете использовать свое собственное имя- см. следующие замечания по синтаксису;

* количества аргументов и их типов данных;

* типа данных возвращаемого значения;

* имени (ENTRY_POINT), С которым функция существует в библиотеке;

* имени библиотеки (MODULE_NAME), которая содержит функцию; Синтаксис декларации:

DECLARE EXTERNAL FUNCTION имя [тип-данных | CSTRING (целое)

[, тип-данных | CSTRING (целое) ...]]

RETURNS {тип-данных [BY VALUE] | CSTRING (целое)} [FREE_IT]

[RETURNS PARAMETER n]

ENTRY_POINT 'точка-входа'

MODULE_NAME 'имя -модуля';

Табл. 21.8 подробно описывает аргументы.

Таблица 21.8. Аргументы оператора DECLARE EXTERNAL FUNCTION

Аргумент

Описание

имя

Имя UDF для использования в операторах SQL. Может отличаться от имени, указанного после ключевого слова ENTRY POINT. Если вы используете существующую библиотеку, то хорошо бы изменить предоставляемое имя - хотя бы для того, чтобы устранить путаницу при объявлении той же функции с другими именами в других базах данных

тип-данных

Тип данных для входного или возвращаемого параметра. Если аргументы не передаются по дескриптору, это тип данных включающего языка. Все входные параметры передаются в UDF по ссылке или по дескриптору. Возвращаемые параметры могут передаваться по ссылке, по значению или по дескриптору. Тип данных не может быть массивом или элементом массива

RETURNS

Спецификация возвращаемого значения функции

BY VALUE

Указывает, что возвращаемое значение должно передаваться по значению, а не по ссылке

CSTRING( целое)

Указывает, что UDF возвращает значение в виде строки с нулевым терминатором с максимальной длиной целое байтов

FREE_IT

Освобождает память возвращаемого значения после завершения выполнения UDF. Используйте это, только если память в UDF выделяется динамически с использованием функции ib_util_malloc, определенной в библиотеке ib_util. Библиотека ib_util должна находиться в каталоге /bin, чтобы вариант FKEE_IT мог работать

RETURNS PARAMETER n

Указывает, что функция возвращает n-й входной параметр. Это требуется для возвращения типов данных BLOB

точка-входа

Заключенная в апострофы строка, задающая имя, под которым UDF присутствует в исходном коде и сохранена в библиотеке UDF

имя-модуля

Заключенная в апострофы спецификация файла, идентифицирующая библиотеку, которая содержит UDF

Поделиться:
Популярные книги

Идеальный мир для Лекаря 23

Сапфир Олег
23. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 23

Империя Хоста 3

Дмитрий
3. Империя Хоста
Фантастика:
боевая фантастика
попаданцы
5.50
рейтинг книги
Империя Хоста 3

Первый среди равных. Книга V

Бор Жорж
5. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга V

Запрети любить

Джейн Анна
1. Навсегда в моем сердце
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Запрети любить

Аргумент барона Бронина 3

Ковальчук Олег Валентинович
3. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 3

Измена. Верни мне мою жизнь

Томченко Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верни мне мою жизнь

Тепла хватит на всех

Котов Сергей
1. Миры Пентакля
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Тепла хватит на всех

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Ваше Сиятельство 9

Моури Эрли
9. Ваше Сиятельство
Фантастика:
боевая фантастика
попаданцы
стимпанк
аниме
фэнтези
5.00
рейтинг книги
Ваше Сиятельство 9

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля