- •Введение
- •1.5. Задание
- •1.6. Ход работы
- •1.6.1. Создание базы данных
- •1.6.2. Регистрация базы данных
- •1.6.3. Подключение к базе данных
- •1.6.4. Удаление базы данных
- •1.6.5. Извлечение метаданных
- •1.6.6. Резервное копирование и восстановление
- •1.7. Отчет о выполнении работы
- •1.8. Контрольные вопросы
- •2.4.2. Домены (Domains)
- •2.5. Задание
- •2.6. Ход работы
- •2.7. Отчет о выполнении работы
- •2.8. Контрольные вопросы
- •3.4.2. Индексы
- •3.5. Задание
- •3.6. Ход работы
- •3.7. Отчет о выполнении работы
- •3.8. Контрольные вопросы
- •4.4.1. Ограничение первичного ключа (Primary key)
- •4.4.2. Ограничения уникальности (Unique)
- •4.4.3. Ограничения внешнего ключа (Foreign keys)
- •4.4.4. Контрольные ограничения (Checks)
- •4.5. Задание
- •4.6. Ход работы
- •4.7. Отчет о выполнении работы
- •4.8. Контрольные вопросы
- •5.4.2. Бизнес-правила
- •5.4.3. Триггеры (Triggers)
- •5.4.4. Исключения (Exceptions) и обработка ошибок
- •5.6. Ход работы
- •5.7. Отчет о выполнении работы
- •5.8. Контрольные вопросы
- •6.4.2. Удаление существующих данных
- •6.4.3. Обновление существующих данных
- •6.5. Задание
- •6.6. Ход работы
- •6.7. Отчет о выполнении работы
- •6.8. Контрольные вопросы
- •7.5. Задание
- •7.6. Ход работы
- •7.7. Отчет о выполнении работы
- •7.8. Контрольные вопросы
- •8.4.2. Модифицируемые представления
- •8.5. Задание
- •8.6. Ход работы
- •8.7. Отчет о выполнении работы
- •8.8. Контрольные вопросы
- •9.4.2. Виды хранимых процедур в InterBase
- •Returns (
- •9.5. Задание
- •9.6. Ход работы
- •9.7. Отчет о выполнении работы
- •9.8. Контрольные вопросы
- •10.4.2. Создание динамической библиотеки с udf
- •Exports
- •Interface
- •10.4.4. Использование udf в базе данных
- •10.5. Задание
- •10.6. Ход работы
- •10.8. Контрольные вопросы
- •11.4.4. Права
10.4.2. Создание динамической библиотеки с udf
Ниже приведен пример библиотеки и модуля с тремя UDF:
-
// файл LibUDF.dpr с текстом библиотеки для Delphi 7: library LibUDF; uses ExtFunct in 'ExtFunct.pas';
-
Exports
-
IsDate index 1 name 'ISDATE',
-
IBDateToStr index 2 name 'IBDATETOSTR',
-
RoundFloat index 3 name 'ROUNDFLOAT';
-
end.
// файл ExtFunct.pas с текстом модуля для Delphi 7:
unit ExtFunct;
Interface
uses SysUtils;
type
PIBDateTime = ^TIBDateTime;
TIBDateTime = record
Date: Integer;
Time: Integer;
end;
function IsDate(var InputDate: TIBDateTime): PIBDateTime;
cdecl;
function IBDateToStr(var InputDate: TIBDateTime): PChar;
cdecl;
function RoundFloat(var Value: Double; var Digits:
Integer): Double; cdecl;
procedure isc_decode_date(IBDateTime: PIBDateTime;
P: Pointer); stdcall;
implementation procedure isc_decode_date; external 'gds32.dll' name 'isc_decode_date';
var OutDate: TIBDateTime;
function IsDate(var InputDate: TIBDateTime): PIBDateTime; cdecl;
begin
// первые 4 байта в InputDate - дата,
// последние 4 байта в InputDate - время;
// достаточно обнулить данные о времени чтобы
// получить только дату.
with OutDate do
begin
Date := InputDate.Date;
Time := 0;
end;
Result := @OutDate;
end;
type PCTimeStructure = ^TCTimeStructure;
TCTimeStructure = record
tm_sec : integer; // Seconds
tm_min : integer; // Minutes
tm_hour : integer; // Hour (0--23)
tm_mday : integer; // Day of month (1--31)
tm_mon : integer; // Month (0--11)
tm_year : integer; // Year = "calendar year"-1900
tm_wday : integer; // Weekday (0--6) Sunday = 0)
tm_yday : integer; // Day of year (0--365)
tm_isdst : integer;
end;
var DateStr: string[11] = #0#0#0#0#0#0#0#0#0#0#0; function IBDateToStr(var InputDate: TIBDateTime): PChar; cdecl;
var B: TCTimeStructure;
D, M, Y, I: Integer;
begin // преобразует дату из формата InterBase. isc_decode_date(@InputDate, @B);
D := B.tm_mday;
M := B.tm_mon + 1;
Y := B.tm_year + 1900;
DateStr := Format('%2d-%2d-%4d', [D, M, Y]);
repeat
I := Pos(' ', DateStr);
if I > 0 then DateStr[I] := '0';
until I = 0;
Result := @DateStr[1];
end;
function RoundFloat(var Value: Double; var Digits: Integer): Double; cdecl;
var F: Double;
begin
F := Frac(Value);
case Digits of
1: F := Round(F*10.0)/10.0;
2: F := Round(F*100.0)/100.0;
3: F := Round(F*1000.0)/1000.0;
else
F := 0;
end;
Result := Int(Value) + F;
end;
end.
Еще один пример создания библиотеки с помощью Delphi с одной функцией пользователя:
T// Файл 'TestUDF.dpr'T для Delphi 7T:
library TestUDF;
// функция определения длины текста в строковых полях
// типов CHAR(n) и VARCHAR(n):
function LengthCharField(C: PChar): Integer; cdecl;
begin
// ищем нулевой символ, который является завершителем
// строки: Result := 0;
while (C[Result] <> #0) do
Inc(Result);
// Если бы эта функция использовалась бы только для
// полей типа VARCHAR, то больше ничего делать не
// надо было бы.
// Если поле имеет тип CHAR, то оно всегда
// дополняется до максимальной длины пробелами,
// поэтому их надо учесть:
Dec(Result);
while (Result >= 0) and (C[Result] = ' ') do
Dec(Result);
Inc(Result);
end;
exports LengthCharField name 'LENGTH_CHAR_FIELD';
end.
Чтобы получить файл с DLL-библиотекой, содержащей UDF, можно, например, ввести исходный текст библиотеки с помощью любого редактора в
файл 'TestUDF.dpr' и откомпилировать его с помощью утилиты командной строки 'dcc32.exe', введя в командной строке следующую команду:
C:\Рабочая папка>dcc32 TestUDF.dpr
В результате этой команды будет создан файл 'TestUDF.DLL', который перед использованием необходимо поместить в специальную папку 'UDF', расположенную в папке с установленным сервером Firebird 1.5.
10.4.3. Объявление функций пользователя в базе данных Синтаксис оператора объявления функции пользователя следующий: DECLARE EXTERNAL FUNCTION name
[datatype | CSTRING(int) [,
datatype | CSTRING(int) ...]]
RETURNS {datatype [BY VALUE] | CSTRING(int)} [FREE_IT] ENTRY_POINT 'entryname'
MODULE_NAME 'modulename';
Параметры, входящие в этот оператор, пояснены в табл. 5.
Таблица 5
Описание параметров оператора описания UDF
Ниже приведены примеры объявления в базе данных созданных выше функций пользователя.
DECLARE EXTERNAL FUNCTION ISDATE
DATE
RETURNS DATE
ENTRY_POINT 'ISDATE' MODULE_NAME 'LIBUDF';
DECLARE EXTERNAL FUNCTION IBDATETOSTR
DATE
RETURNS CSTRING(11)
ENTRY_POINT 'IBDATETOSTR' MODULE_NAME 'LIBUDF';
DECLARE EXTERNAL FUNCTION ROUNDFLOAT
DOUBLE PRECISION, INTEGER
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'ROUNDFLOAT' MODULE_NAME 'LIBUDF';
-- функция определение длины строкового поля с
-- отбрасыванием конечных пробелов:
DECLARE EXTERNAL FUNCTION STRING_LENGTH
CSTRING(100) -- в функцию передается указатель на
-- строку, заканчивающуюся нулевым
-- символом (#0) и длина здесь должна
-- быть не меньше, чем длина поля CHAR
-- или VARCHAR
RETURNS INTEGER BY VALUE –- возврат по значению ENTRY_POINT 'LENGTH_CHAR_FIELD'
MODULE_NAME 'EducatorUDF';