- 外置函数:firebird内置函数不多,到2.5为止也不支持自定义函数,但firebird最强大也最迷人的是能很容易的支持外置函数标准函数.你可以找到很多现成的firebird的外置函数.也可以用vc delph gcc很容易的编写外置函数.
- 安装文件自带的外置函数:在目录/Udf下,有fbudf.dll ib_udf2.dll以及相应的sql外置函数注册命令,只需简单运行相应sql文件就能注册这些外置函数.(如图)
- 编写自己的外置函数,我用delphixe2 编写一个简单返回字符串MD5值的函数.
library BskyFBPub;
uses
System.SysUtils,
System.Classes,
Besky.md5,//这个文件将在下一篇专门来讲
//需要引入firebird的ib_util.pas
ib_util in 'X:DataBaseFirebird_2_5includeib_util.pas';
{$R *.res}
function Md5str(s: Pansichar): Pansichar; stdcall;
var
ans: ansistring;
pach: Pansichar;
begin
ans := GetMD5StrOfString(s);
// GetMem(pach,32);
{ 用ib_util.pas的ib_util_malloc 代替 GetMem
分配的内存一定要比返回的制所需的内存大1,最好按8字节对齐
所以MD5至少需要分配33,按8字节对齐分配40
}
pach := ib_util_malloc(40);
StrPCopy(pach, ans);
Result := pach;
end;
exports
Md5str;
begin
end.
--------------
这里要注意:凡是要进行内存分配,且分配的内存是给函数的返回值,而需要firebird自己施放这个内存时,必须使用firebirdbinib_util.dll自带的内存分配函数.她的delphi引入单元文件和c的头文件都在目录include下,在你的程序里引用即可.
unit ib_util;
interface
function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';
implementation
end.
这里用到的支持64位的 Besky.md5.pas将在下一篇专门讲述 - 注册这个函数到数据库.
DECLARE EXTERNAL FUNCTION MD5STR
CSTRING(20480)
RETURNS CSTRING(40) FREE_IT
ENTRY_POINT 'Md5str' MODULE_NAME 'BskyFBPub'; - 测试一下:
select staffid,staffname,md5str(staffname) as md5name from ys_staff - 返回如图
- 安装文件自带的外置函数:在目录/Udf下,有fbudf.dll ib_udf2.dll以及相应的sql外置函数注册命令,只需简单运行相应sql文件就能注册这些外置函数.(如图)