Автор работы: Пользователь скрыл имя, 20 Октября 2009 в 15:59, Не определен
Загайнов И.А. Проектирование информационных систем: Конспект мультимедиа лекций для студентов специальностей 050704 – Вычислительная техника и программное обеспечение, 050703 – Информационные системы.
8.1 Функции (UDF).
Функции, определяемые пользователем – User Defined Functions (UDF).
Определение и назначение.
Набор функций SQL – сервера InterBase.
Объявление функции, определяемой пользователем.
Разработка функций в Delphi.
Совместимость
переменных SQL – сервера и среды разработки
Delphi.
8.2 Определение.
Функции (UDF) предназначены для расширения возможностей серверной части проектируемой информационной системы, поскольку набор встроенных функций ограничен: AVG(), SUM(), COUNT(), MAX(), MIN(), CAST(), UPPER(), EXTRACT(), ||, математические операции.
Используется механизм подключения внешних библиотек.
Проектирование функций может осуществляться на любом алгоритмическом языке, позволяющем создавать динамически загружаемые библиотеки.
Реализация
в виде dll – библиотеки. Одна библиотека
должна содержать минимум одну функцию.
8.3 Примеры функций.
Встроенная библиотека функция сервера IB расположена в каталоге:
C:Program FilesBorlandInterBaseUDF
Если каталог не существует, необходимо создать.
Каталог содержит файл библиотеки - ib_udf.dll, с примерами некоторых функций:
abs(), acos(), asin(), cos(), log(), rand() …
Пользователь
имеет возможность подключать собственные
библиотеки с наборами функций. В примере
рассматривается проектирование функции,
генерирующей случайный символ из заданного
диапазона кодов.
8.4 Объявление функций.
Определение функции на сервере производится SQL – оператором:
DECLARE EXTERNAL FUNCTION name [datatype | CSTRING (int)
[, datatype | CSTRING (int) …]]
RETURNS {datatype [BY VALUE] | CSTRING (int)} [FREE_IT]
ENTRY_POINT 'entryname' // Имя функции
MODULE_NAME 'modulename'; // Имя файла (путь к библиотеке)
По умолчанию
сервер ищет функцию в корневом каталоге,
определяемом при инсталляции.
8.5 Пример объявления.
Для всех функций библиотеки примера ib_udf.dll создан файл описания ib_udf.sql, содержащий полный перечень операторов объявления на сервере, хранящийся в каталоге
C:Program
FilesBorlandInterBase
Файл содержит краткое описание и операторы определения функций, готовые к выполнению в редакторе запросов среды управления.
Там же
расположены модули проектов в языке
программирования С.
8.6 Порядок действий.
Например, выполним объявление функции rand():
DECLARE EXTERNAL FUNCTION rand
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'IB_UDF_rand' MODULE_NAME 'ib_udf';
8.7 Пример.
Просмотр объявленной функции в среде Expert:
8.8 Вопрос.
Функцию вызова значения генератора gen_id() можно использовать в операторе:
1. Создания триггера.
2. Создания хранимой процедуры.
3. INSERT.
4. UPDATE.
5. Нет
правильного ответа.
8.9 Проверка вызова.
Проверка
объявленной функции
CREATE TABLE TUDF ( T1 INTEGER,
T2 DOUBLE PRECISION, T3 FLOAT );
Выполнением нескольких операторов:
insert into tudf (T2 ) values (rand()); или
insert into tudf (T3 ) values (rand());
Обратите
внимание на отсутствие случайности
в данных.
8.10 Проектирование библиотеки.
Проектирование библиотеки функций в Delphi осуществляется в шаблоне DLL Wizard выбираемом из репозитория проектов:
8.11 Код функции.
В открывшемся окне создаем набор функций:
8.12 Листинг кода.
library MyIB_UDF;
Uses SysUtils, Classes;
{$R *.res}
function randomx(var InInt:Integer):Integer; cdecl; export;
begin
Result:=(Trunc(Int(Random(
end;
function randvar():PChar; cdecl; export;
begin
Result:=PChar(Trim(AnsiString(
end;
exports randomx, randvar;
begin
end.
8.13 Описание параметров.
cdecl – директива, указывающая компилятору на использование соглашений для передачи параметров, принятых в С++.
export – объявление функции экспортируемой.
Совместимость переменных.
Для совместимости строковых переменных InterBase и Delphi используются соответствующие форматы:
CSTRING – PChar;
DOUBLE PRECISION
– Double;
8.14 Объявление.
Операторы объявления вновь созданных функций оформляются аналогично операторам встроенной библиотеки:
DECLARE EXTERNAL FUNCTION RANDVAR
RETURNS CSTRING(1) FREE_IT
ENTRY_POINT
'randvar' MODULE_NAME 'MyIB_UDF'
DECLARE EXTERNAL FUNCTION RANDOMX INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'randomx' MODULE_NAME 'MyIB_UDF'
Библиотеку необходимо разместить в каталоге
C:Program
FilesBorlandInterBaseUDF
8.15 Удаление библиотеки.
Удаление объявленных функций библиотеки производится оператором:
DROP EXTERNAL FUNCTION name;
При внесении
изменении в оператор объявления
функции IBExpert генерирует два оператора,
на удаление старого объявления, и
создание нового.
8.16 Вопрос.
Выбрать наиболее точный ответ для среды разработки функций, определяемых пользователем в SQL – сервере InterBase:
1. Функции процедурного языка и SQL – операторы сервера InterBase.
2. Элементы языка управления данными (DML) и типы данных, используемых в SQL – сервере InterBase.
3. Элементы любого алгоритмического языка, позволяющего создавать динамически загружаемые библиотеки (DLL).
4. Функции и типы данных, определенные в Delphi, для динамически загружаемых библиотек.
5. Любые
функции и типы данных, используемых в
языке Object Pascal.
8.17 Предупреждения.
Объектом метаданных является оператор объявления функции, но не сама библиотека.
Для транспортировки всех компонентов системы, требуется перенос всех файлов библиотек в определенном каталоге.
Для каждой
задачи может создаваться собственный
каталог для библиотек расширения.
8.18 Версия IB 7.
Из описания к 7 версии IB (DevGuide.pdf).
Встроенная библиотека - ib_util.dll , примеры:
Function
name Description Inputs Outputs
abs() Absolute value Double precision Double precision
acos( ) Arc cosine Double precision Double precision
ascii_char( ) Return character based
on ASCII code Integer Char(1)
ascii_val( ) Return ASCII code for given
character Char(1) Integer
asin( ) Arc sine Double precision Double precision
atan( ) Arc tangent Double precision Double precision
atan2( ) Arc tangent divided by second Double precision,
argument Double precision Double precision
bin_and( ) Bitwise AND operation Integer Integer
bin_or( ) Bitwise OR operation Integer Integer
bin_xor( ) Bitwise XOR operation Integer Integer
ceiling() Round up to nearest whole value Double precision Double precision
cos( ) Cosine Double precision Double precision