Пример создания DLL с несколькими UDF и объявления их в БД
Создадим DLL с именем 'UDF_DLL', в состав которой входят три функции:
library udf_dll;
uses
SysUtils,
Classes;
type
TIBDateTime = record
Days,
MSecIO : Cardinal;
end;
PInteger = ^Integer;
// функция усекает ведущие и хвостовые пробелы у строкового // значения, передаваемого как параметр function TrimChar(InString : PChar) : PChar; cdecl; export;
begin
Result := PChar(Trim(AnsiString(InString)));
end;
//функция возвращает (по значению) номер дня передаваемой в качестве параметра даты
function Den(var InDate : TIBDateTime) : Integer; cdecl; export;
var DT : TDateTime;
Gd,Ms,Dn : Word;
begin
DT := InDate.Days - 15018 + InDate.MSecIO / (MSecsPerDay * 10);
DecodeDate(DT,Gd,Ms,Dn) ;
Result := Integer(Dn);
end;
//функция возвращает (по ссылке) номер месяца передаваемой в качестве параметра даты
function Mes(var InDate : TIBDateTime) : PInteger; cdecl; export;
var DT : TDateTime;
Gd,Ms,Dn : Word;
R : Integer;
begin
DT := InDate.Days - 15018 + InDate.MSecIO / (MSecsPerDay * 10);
DecodeDate(DT,Gd,Ms,Dn);
R := Ms;
Result := @R;
end;
exports
TrimChar,
Den,
Mes;
begin
end.
После генерации модуля UDF_DLL.DLL переместим его в подкаталог BIN каталога на диске, в котором расположен сервер InterBase. Затем объявим функции в БД:
DECLARE EXTERNAL FUNCTION TRIMCHAR CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT "TrimChar"
MODULE_NAME "udf_dll";
DECLARE EXTERNAL FUNCTION DEN DATE
RETURNS INTEGER BY VALUE
ENTRY_POINT "Den"
MODULE_NAME "udf_dll";
DECLARE EXTERNAL FUNCTION MES DATE
RETURNS INTEGER
ENTRY_POINT "Mes"
MODULE_NAME "udf_dll";
Примеры использования объявленных в БД функций пользователя в операторе SELECT:
SELECT TRIMCHAR (POKUP) || ' ' II GOROD
FROM POKUPATELI
SELECT *
FROM RASHOD
WHERE DEN(DAT_RASH) > 10;