Корпоративные базы данных - статьи

       

Внешние функции хранимых процедур



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


  • Перенос процедурной логики в базу данных для распределенной
    использования многими приложениями.
  • Улучшение производительности путем объединения большого количества
    запросов к базе данных в один вызов сервера.

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



В случае SQLBase процедурным языком является SAL. Однако, как указывалось выше, язык
хранимых процедур SQLBase все еще является подмножеством полного языка SAL, имеющегося в
SQLWindows. Кроме того, многие пользователи SQLBase хотели бы иметь возможность создавать
собственные процедуры, не будучи привязанными к какому-либо конкретному языку.

Естественно, одним из способов расширения функциональности хранимых процедур SQLBase
является расширение используемого подмножества языка SAL. Такой путь, однако, не дает
возможности пользователям гибко добавлять компоненты и собственные функции для реализации
дополнительной функциональности существующих систем. Поэтому процесс придания хранимым
процедурам SQLBase большей "открытости" проводится по двум направлениям:


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

Первым шагом на этом пути является поддержка в SQLBase нового типа объектов базы данных,
называемого внешней функцией (External Function).

Внешняя функция - это любая пользовательская функция, которая располагается в отдельной
библиотеке (Dynamic Link Library или DLL для платформы Windows) и может быть динамически

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

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

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

Применение внешних функций дает пользователям SQLBase следующие преимущества:


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

Внешняя функция является новым объектом схемы базы данных SQLBase.


Она создается с
помощью команды CREATE EXTERNAL FUNCTION. Имя функции, ее физическое положение и
интерфейс (параметры и их типы данных, возвращаемые данные и пр.) передаются в этой команде.
Данная информация хранится в системном каталоге в специальных таблицах. Ниже приведен
пример описания внешней функции.

CREATE EXTERNAL FUNCTION MyFunc
PARAMETERS (Number: INT)
RETURNS (BOOLEAN: WORD)
DESCRIPTION 'Sample External Function Declaration'
LIBRARY MYLIB.DLL
EXPORT ORDINAL 2
EXECUTE IN SAME THREAD
Типы данных для параметров функции и возвращаемого значения состоят из двух частей. Сначала
описывается "внутренний формат", соответствующий стандартным типам данных SAL. Могут
быть использованы все типы данных SAL, которые поддерживаются хранимыми процедурами (см.
выше). "Внешний формат", который следует за внутренним, описывает один из стандартных
форматов C, который служит для передачи данных во внешнюю функцию.

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

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


  • Набор пользовательских функций трансформации и трансляции данных,
    которые могут быть использованы при извлечении строк из результата запроса,
    а также при вставке и изменении строк. Функция такого типа может принимать
    значение одной (или нескольких) колонки и возвращать трансформированные
    данные на основе действующих в организации правил (business rules) для
    отображения в приложении.
  • Следующая категория функций может быть названа "Предупреждения и
    уведомления". Их суть состоит в том, что при наступлении определенного
    состояния базы данных могут запускаться триггеры. Эти триггеры выполняют
    хранимые процедуры. Может оказаться полезным уведомлять некоторых


    пользователей или приложения о наступлении определенного состояния базы
    данных. Одним из примеров такого типа функций может быть функция,
    направляющая по электронной почте сообщение определенным
    пользователям о том, что данные в созданных ими таблицах были изменены
    другими пользователями. С помощью этих же функций можно в принципе
    реализовать механизм "теплой связи", когда пользователь будет получать
    уведомления от сервера всякий раз, когда будут изменены данные его result
    set.
  • Еще одной иллюстрацией возможностей технологии внешних функций
    может являться пример удаленного доступа для запуска хранимых процедур.
    Например, приложение может вызвать хранимую процедуру на локальном
    сервере SQLBase, чтобы получить доступ к некоторым данным. Однако,
    хранимая процедура может содержать логику, распознающую ситуацию когда
    требуемые данные на сервере отсутствуют или являются устарелыми. В таком
    случае использование внешней функции поможет установить контакт к
    удаленной базе данных и извлечь нужные данные. Эти данные затем могут
    быть занесены в локальную базу данных и возвращены приложению.
  • Другим классом внешних функций могут быть генераторы отчетов в режиме
    off-line. При этом вместо запуска приложения отчетов с клиентской машины
    весь модуль (или набор функций) может быть создан в виде динамической
    библиотеки, которая вызывается из хранимой процедуры как внешняя функция.
    Код этой функции может осуществлять контакт с базой данных и извлекать
    нужные для генерации отчета данные. Основным преимуществом такого
    подхода является повышение производительности, поскольку весь код будет
    выполняться на сервере без передачи данных и команд по сети.

Многие ведущие производители СУБД включают поддержку вызова внешних функций из серверов
баз данных. Некоторые из них поддерживают только вызовы внешних функций с помощью
расширений процедурных языков ( в качестве примеров можно привести Microsoft SQLServer для
NT и Sybase). Другие допускают вызов функций также из SQL запросов.К таким система
относятся Oracle 7 и Rdb. В последующих версиях SQLBase. фирма Gupta планирует реализовать
несколько механизмов вызова внешних функций, включая их использование в выражениях SQL
запросов (сейчас в этих целях используются встроенные функции SQLBase).


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