firebird 的存储过程(procedure)和外置函数(EXTERNAL FUNCTION)

  • 存储过程(Procedure):大体分为两类
    • 处理单条记录和运算并返回单条数据我称为:"单处理过程".
      列:
      SET TERM ^ ;
      CREATE OR ALTER PROCEDURE DBST (
          s varchar(1024) not null)
      returns (
          rs varchar(2048))
      as
      begin
        rs=s||s;
        suspend;
      end^
      SET TERM ; ^


      select * from dbst('OK')
      --------结果----------
      OKOK
    • 处理多条记录返回单条统计记录或多条处理后数据的我称为:"集处理过程"
      列:
      SET TERM ^ ;

      CREATE OR ALTER PROCEDURE DOUBLESTR
      returns (
          stfid integer,
          stfname key_name)
      as
      begin
       for
       select staffid, staffname from ys_staff into : stfid, :stfname
       do
       begin
         stfname=stfname||stfname;
         suspend;
       end
      end^

      SET TERM ; ^
       
  • 外置函数: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:\DataBase\Firebird_2_5\include\ib_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自己施放这个内存时,必须使用firebirdbin\ib_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
    • 存储过程和外置函数相结合有以下多项好处:
      • 可以弥补C#和php托管、解释语言的不足.
      • 可以降低对C#和php程序员的要求(当然至少需要一个高级的delphi或Vc程序员),实际上他们只需要简单调用firebird里现成的procedure就行,这对现在人才市场上有大量初级C#和php程序员而缺少高级delphi和vc程序现状来说极大的降低了公司招人和培训的难度.
      • 可以容易的做到统一的数据格式而无论程序员使用什么开发语言.
      • 可以容易的升级和更改后台数据处理,很容易做到一处更改,全局生效.
      • 更多细节将在以后的多人开发框架里探讨.
  • 为了能实现最终的多人开发框架,下面几篇将探讨几个这个框架的关键技术:加密、解密、压缩、多线程。之后我们将探讨客户端的关键javascrpt形成的框架。

    转自http://blog.sina.com.cn/s/blog_53866d75010102g9.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值