User defined functions, interbase, статті, програмування - програмування c, delphi, c #
User Defined Functions
Найчастіше від програмістів, що використовують інші сервери баз даних, можна почути думку, що SQL InterBase не відрізняється великою різноманітністю вбудованих функцій. Формально така точка зору має підстави, проте розробники InterBase свідомо пішли на це обмеження. Як уже неодноразово було сказано, InterBase відрізняється скромними системними вимогами і займає мало місця на жорсткому диску. Невеликий сукупний розмір файлів продиктований, зокрема, тим, що InterBase не перевантажений різноманітними додатковими і, в общем-то, рідко використовуваними функціями Зате InterBase включає можливість розширити стандартний набір функцій будь-якими доповненнями, які потрібні в конкретній базі даних. Таким чином, розробник може реалізувати для своїх додатків навіть такі функції, які ніколи не входять в поставку серверів баз даних.
Механізм підключення функцій
Спеціально для розширення функціональності SQL InterBase пропонує механізм функцій, визначених користувачем (user defined functions). Ви можете створити динамічну бібліотеку (Dynamic Link Library) за допомогою будь-якої системи розробки, яка дозволяє створювати виконувані файли даного формату. Зокрема, можна використовувати Borland Delphi, Borland C ++ Builder, Microsoft Visual C ++ і т. Д. Далі, необхідно помістити отриману DLL в каталог, з якого InterBase зможе викликати бібліотеку, і декларувати потрібні функції з DLL в своїй базі даних за допомогою команди DECLARE EXTERNAL FUNCTION. Після цього ви зможете викликати зазначені функції, як якщо б вони були вбудованими функціями InterBase.
InterBase до версії 6.0 вимагав, щоб DLL перебувала в будь-якому з каталогів, зазначених в системній змінній PATH InterBase 6 і вище (включаючи клони Firebird і Yaffil) вимагає, щоб DLL була поміщена в спеціальний каталог UDF, що знаходиться в загальному каталозі установки InterBase
Створення власних функцій
Ми не будемо детально зупинятися на всіх особливостях створення призначених для користувача функцій, оскільки даний механізм досить простий, однак продемонструємо написання і підключення однієї функції на прикладі. Як засіб розробки ми будемо використовувати Borland Delphi. Для прикладу також буде застосовуватися стандартна база даних EMPLOYEE.GDB.
У нашому прикладі ми створимо функцію, яка буде перетворювати рядок до верхнього регістру. Подібна функція може виявитися корисною, якщо ви не задали опцію COLLATE для ваших строкових полів. Крім того, робота із строковими параметрами, як правило, викликає найбільшу кількість питань при створенні призначених для користувача функцій. Зрозуміло, ми виходимо з припущення, що ви знайомі з принципом створення DLL за допомогою Delphi.
Динамічна бібліотека експортує тільки одну функцію: StrUpperCase. Для передачі строкових параметрів, так само як і результату функції, використовується тип Pchar, т е. Динамічна рядок, обмежена символами # 0. Сенс коду нашої функції очевидний: ми наводимо рядок sz у верхній регістр, використовуючи стандартну функцію AnsiUpperCase. Ця функція коректно працює з українськими літерами, якщо в системі встановлена російська кодова сторінка. Після цього виділяємо пам'ять для результуючої змінної, використовуючи malloc - стандартну функцію Windows. Залишається тільки скопіювати значення тимчасової змінної Tmp в змінну Result. Скомпілюйте бібліотеку і помістіть отриманий файл TestUDF.dll в потрібний каталог. Якщо ви використовуєте InterBase 6.x або його клони, то це каталог \ Udf, який знаходиться в каталозі установки сервера. Необхідно зареєструвати функцію в базі даних. Для реєстрації необхідно виконати команду DECLARE EXTERNAL FUNCTION, яка має наступний синтаксис:
DECLARE EXTERNAL FUNCTION name [datatype | CSTRING (int)
[, Datatype | CSTRING (int). ]]
RETURNS (datatype [BY VALUE] | CSTRING (int)> [FREE_IT]
ENTRY_POINT 'entryname'
MODULE_NAME 'modulename';
Параметр name - це ім'я користувача функції всередині бази даних. Він не обов'язково повинен збігатися з реальним назвою функції в DLL.
Параметр datatype визначає тип параметрів. На параметри накладаються наступні обмеження:
- всі параметри передаються по посиланню;
- вихідний параметр (значення функції) може повертатися за значенням;
- параметри не можуть бути масивами.
Якщо ви хочете застосовувати строкові параметри, то ви повинні використовувати тип CSTRING У дужках необхідно вказати максимальну довжину рядка. Якщо рядок є результатом функції, вона завжди передається по посиланню, а не за значенням.
Параметр FREE_IT вказує InterBase, що після виконання функції необхідно автоматично звільнити пам'ять, виділену для параметрів. Очевидно, ця опція потрібна тільки в тому випадку, якщо наша бібліотека сама мм ділила пам'ять під будь-які параметри функції.
У параметрі entryname необхідно вказувати назву функції в DLL, до торую ми власне і хочемо декларувати як для користувача функцію.
У параметрі modulename необхідно вказати назву файлу DLL, в якому знаходиться декларована функція користувача.
Варто зауважити, що параметри entryname і modulename регістрочувствітельние.
Таким чином, щоб додати нашу функцію в базу даних, нам необхідно виконати наступну команду:
DECLARE EXTERNAL FUNCTION USTRUPPERCASE
cstring (254)
RETURNS cstnng (254) FREE_IT
ENTRY_POINT 'StrUpperCase' MODULE_NAME 'TestUDF.dll'
Після цього ми зможемо використовувати нову функцію USTRUPPERCASE в будь-якому SQL-запиті. Наприклад, ми можемо перевірити, як працює функція на наступному запиті:
SELECT USTRUPPERCASE (DEPARTMENT) FROM DEPARTMENT
Запит поверне назви відділів з таблиці DEPARTMENT:
Рис 1.5. Результат використання UDF USTRUPPERCASE
Ми розглянули на прикладі, як можна розширювати набір доступних SQL-функцій за допомогою механізму User Defined Functions. Маючи цей простий, але дуже потужний механізм, ви зможете зробити обробку бізнес-правил у ваших базах даних набагато ефективніше і зручно. По суті, механізм для користувача функцій InterBase має тільки одне серйозне обмеження - він не дозволяє обробляти NULL-параметри. В іншому функціональність для користувача "розширень" SQL залежить тільки від ваших потреб.
Широкий вибір UDF-бібліотек, а також більш докладну інформацію про їх використання та розробки завжди можна знайти на сайтах www.InterBaseworld.com і www.ibase.ru.
Borland InterBase 6.x і його клони Firebird і Yaffil - продукти, орієнтовані на міжнародного споживача і дозволяють працювати з безліччю різних мов, в тому числі і українським. Однак за замовчуванням InterBase буде орієнтуватися на роботу з англійською мовою, тому для того, щоб зберігати в базі даних кирилицю і мати можливість отримувати її в Новомосковскбельном вигляді, необхідно провести ряд дій по "русифікації" бази даних та включення підтримки кирилиці в клієнтських додатках.