Опубликован: 07.05.2010 | Уровень: специалист | Доступ: свободно
Лекция 23:

Стандартные функции InterBase. UDF

< Лекция 22 || Лекция 23: 12 || Лекция 24 >

UDF

В практике программирования нередко встречаются ситуации, когда программисту недостаточно того набора функций, который предоставлен сервером InterBase. К счастью, InterBase дает возможность создавать и подключать к базе данных собственные функции, которые называются UDF ( User Defined Functions - Функции, определенные пользователем). Прелесть этого механизма в том, что такие функции можно написать на любом языке программирования, включая Delphi, который позволяет делать библиотеки DLL ( Dynamic Link Library - Динамически подключаемые библиотеки). Программист может реализовать в одном или нескольких DLL -файлах множество необходимых ему функций практически любой сложности, затем поместить этот файл (файлы) там, где установлен InterBase. Останется только подключить описанные функции к рабочей базе данных, после чего любую из этих функций можно использовать в запросах на любых клиентских ПК.

Для демонстрации этой возможности как нельзя лучше подойдет функция Upper_Rus, описанная В.В.Фароновым в книге "Программирование баз данных в Delphi7. Учебный курс". Функция преобразует все символы строки в верхний регистр, но в отличие от стандартной Upper, она корректно сработает и с другими наборами символов и порядком сортировки.

Для начала нам нужно создать DLL -файл. Откройте Delphi. В нашем случае нам нужно будет создать отдельный DLL -файл, поэтому создавать его нужно как отдельный проект. Выберите команду меню < File -> Close All >, чтобы закрыть новое приложение, которое Delphi запускает автоматически. Затем выберем команду < File -> New -> Other >. Откроется окно, в котором на вкладке New нам нужно выбрать DLL Wizard:

Выбор "мастера" DLL

Рис. 23.2 . Выбор "мастера" DLL

При этом откроется окно модуля без всяких форм, которое содержит лишь следующий код (комментарии опущены):

library Project1;

uses
  SysUtils,
  Classes;

{$R *.res}

begin
end.

Выберем команду < File -> Save All >, где нам предложат сохранить проект без всяких модулей. Создайте для проекта отдельную папку, а проект назовите Udf_Dll. Далее приводится весь код библиотеки Udf_Dll (без комментариев):

library Udf_Dll;

uses
  SysUtils, Classes;

{$R *.res}

function Upper_Rus(InpString: PChar): PChar; cdecl;
//Функция преобразует буквы входной строки в заглавные
begin
  Result := PChar(ANSIUpperCase(String(InpString)));
end;

exports Upper_Rus;

begin
end.

Поскольку это DLL -проект, который не может работать самостоятельно, выбирать команду Run не нужно. Вместо этого нажмите < Ctrl+F9 >, либо выберите команду < Project -> Compile Udf_Dll >. В результате в указанной вами папке появится файл Udf_Dll.dll.

В приведенном выше коде мы создали функцию Upper_Rus, которая имеет входной и выходной строковые параметры типа PChar (строковый тип Windows ). Кроме того, для правильной работы с InterBase, эта экспортируемая функция задекларирована как cdecl (соглашение о передаче входных параметров). В теле функции входная строка преобразуется в верхний регистр функцией WinAPI ANSIUpperCase, благодаря чему ЛЮБОЙ набор символов (не обязательно русский) будет корректно преобразован в верхний регистр.

В конце мы указываем, что описанная функция Upper_Rus предназначена для экспорта.

Delphi можно закрыть. Полученный файл динамической библиотеки Udf_Dll.dll скопируйте в каталог UDF сервера InterBase (по умолчанию - C:\Program Files\Borland\InterBase\UDF). Если скопировать файл в другой каталог, InterBase его не найдет.

Теперь эту функцию нужно зарегистрировать в базе данных First (сервер InterBase должен быть запущен, утилита IBConsole открыта, база данных First выделена и запущена утилита Interactive SQL ). В окне запросов Interactive SQL укажите следующий запрос:

DECLARE EXTERNAL FUNCTION UPPER_RUS
CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT 'Upper_Rus'
MODULE_NAME 'UDF_DLL';
COMMIT;

Здесь указан тип строк InterBase CSTRING, что соответствует типу PChar в Delphi, и установлено ограничение в 256 символов. Теперь, если вы посмотрите в дереве серверов IBConsole в разделе " External Functions " нашей БД First, вы увидите зарегистрированную функцию UPPER _RUS.

В Interactive SQL мы можем ввести запрос, показывающий разницу между стандартной функцией UPPER и нашей функцией UPPER _RUS (может потребоваться перезагрузка IBConsole, или хотя бы закрытие ( Disconnect ) и открытие ( Connect ) базы данных First ):

SELECT UPPER(Nazvanie COLLATE WIN1251), UPPER_RUS(Nazvanie COLLATE WIN1251)
FROM Tovar;
Разница работы стандартной UPPER и UPPER_RUS

Рис. 23.3 . Разница работы стандартной UPPER и UPPER_RUS

Как видно из рисунка, там, где стандартная функция UPPER не смогла преобразовать текст в верхний регистр, функция UPPER _RUS с этой задачей справилась. Далее эту функцию можно использовать в пределах базы данных First на любом пользовательском ПК, который подключен к InterBase.

< Лекция 22 || Лекция 23: 12 || Лекция 24 >
Евгений Медведев
Евгений Медведев
Не могу вставить модуль данных
Анна Зеленина
Анна Зеленина
пытаюсь повторить упражнение в лекции 5
Сергей Пастухов
Сергей Пастухов
Россия, Москва
Сергей Власюк
Сергей Власюк
Украина