
- •Лекция №17 Работа с blob и функции, определенные пользователем. Транзакции. Механизм транзакций
- •1 Работа с blob
- •Сложности, связанные с использованием неструктурированных данных
- •Хранение неструктурированных данных в sql Server 2008
- •Что такое filestream
- •Varbinary(max), хранящийся не в бд, а в файловой системе
- •Условия использования filestream
- •2 Функции, определенные пользователем (udf)
- •3 Транзакции. Механизм транзакций
- •Явные транзакции
- •Распределенные транзакции
- •Вложенные транзакции
2 Функции, определенные пользователем (udf)
Функции, определенные пользователем (User Defined Functions, UDF), — это программы, написанные на любом языке программирования, и хранящиеся в библиотеках dll (для Linux — so). Они существенно расширя- ют возможности SQL по обработке данных.
Для того чтобы функция стала доступной в операторах SQL, необходимо выполнить оператор DECLARE EXTERNAL FUNCTION, который объявляет существующую функцию, определенную пользователем. Его син- таксис:
DECLARE EXTERNAL FUNCTION <имя UDF>
[ <тип данных> [BY DESCRIPTOR] | CSTRING (<целое>)
[, <тип данных>[BY DESCRIPTOR] | CSTRING (<целое>) ]...]
RETURNS { <тип данных> [BY VALUE | BY DESCRIPTOR]
| CSTRING (<целое>)
| PARAMETER <номер> } [FREE_IT]
ENTRY_POINT '<имя точки входа>'
MODULE_NAME '<имя модуля>';
Имя UDF — то имя, которое будет использоваться при обращении к функции в операторах SQL. Это имя может отличаться от имени точки входа.
После имени функции перечисляются входные параметры, передаваемые функции. Параметры разделяются запятыми. Для каждого параметра указывается либо тип данных SQL, либо ключевое слово CSTRING. Это ключевое слово означает, что параметр является строкой символов, которая заканчивается нулевым значением. В скобках за этим словом задается максимальное число символов, которое может присутствовать в строке, включая завершающее нулевое значение.
Обязательное предложение RETURNS описывает возвращаемый функцией выходной параметр. Функция UDF всегда возвращает ровно одно значение. Можно указать тип данных SQL, строку, завершающуюся нулевым значением (CSTRING) или ключевое слово PARAMETER, за которым следует число.
Ключевое слово PARAMETER используется, когда возвращается значение типа BLOB. Номер задает порядковый номер входного возвращаемого параметра.
Ключевое слово BY VALUE означает, что данное возвращается по значению, а не по ссылке (по умолчанию значение возвращается по ссылке).
Ключевое слово BY DESCRIPTOR задает передачу параметров по дескриптору.
Ключевое слово FREE_IT означает, что память, выделенная для хранения возвращаемого значения, должна быть освобождена после завершения выполнения функции. Применяется только в том случае, если эта память в UDF выделялась динамически.
Предложение ENTRY_POINT указывает имя точки входа для функции в модуле.
Предложение MODULE_NAME задает имя модуля, в котором находится описываемая функция.
Оператор ALTER EXTERNAL FUNCTION позволяет изменить в функции UDF имя точки входа и/или имя модуля. Его синтаксис:
ALTER EXTERNAL FUNCTION <имя UDF>
[ENTRY_POINT '<имя точки входа>']
[MODULE_NAME '<имя модуля>'];
Имя UDF — имя существующей функции. Предложение ENTRY_POINT указывает новое имя точки входа для функции в модуле. Предложение MODULE_NAME задает новое имя модуля, в котором находится описываемая функция. Функции и скрипты располагаются в каталоге UDF корневого каталога инсталляции сервера базы данных. Чтобы сделать функции, определенные пользователем, доступными при работе с вашей базой данных, необходимо выполнить соответствующие скрипты, добавив в самое начало скрипта оператор соединения с вашей базой данных CONNECT.
Пример объявления функции abs в файле скриптов ib_udf.sql:
DECLARE EXTERNAL FUNCTION abs
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'IB_UDF_abs' MODULE_NAME 'ib_udf';
Функция может получать произвольное количество входных параметров или ни одного. Каждая функция возвращает одно значение указанного типа. При обращении к функции, определенной пользователем, необходимо после имени функции в скобках указать передаваемые функции параметры. Если функция не получает входных параметров, то обязательно нужно записать круглые скобки.