КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Использование UDF в базе данных
DATE DATE Begin Begin Repeat Begin Begin Type Interface End. Exports Создание динамической библиотеки с UDF Ниже приведен пример библиотеки и модуля с тремя UDF: // файл LibUDF.dpr с текстом библиотеки для Delphi 7: library LibUDF; uses ExtFunct in ' ExtFunct.pas '; IsDate index 1 name ' ISDATE ', IBDateToStr index 2 name ' IBDATETOSTR ', RoundFloat index 3 name ' ROUNDFLOAT ';
// файл ExtFunct.pas с текстом модуля для Delphi 7: unit ExtFunct; uses SysUtils; 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; // первые 4 байта в InputDate - дата, // последние 4 байта в InputDate - время; // достаточно обнулить данные о времени чтобы // получить только дату. with OutDate do 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] ); 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; 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 7 T: library TestUDF; // функция определения длины текста в строковых полях // типов CHAR(n) и VARCHAR(n): function LengthCharField ( C: PChar ): Integer; cdecl; // ищем нулевой символ, который является завершителем // строки: 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 RETURNS DATE ENTRY_POINT 'ISDATE' MODULE_NAME 'LIBUDF'; DECLARE EXTERNAL FUNCTION IBDATETOSTR 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';
Объявленную в базе данных функцию пользователя можно использовать при создании доменов и таблиц в вычислимых полях, значениях по умолчанию и контрольных ограничениях. Их можно использовать в операторах изменения данных, триггерах, хранимых процедурах и просто в запросах. Приведем пример запроса с созданными и объявленными выше функциями пользователя:
это запрос для базы данных Employee.fdb: SELECT SALARY, HIRE_DATE, ROUNDFLOAT ( SALARY, 2), IBDateToStr ( HIRE_DATE ), IsDate ( HIRE_DATE ), CAST( SALARY AS INTEGER) FROM EMPLOYEE;
Дата добавления: 2015-04-29; Просмотров: 441; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |