今天稍微研究了一下Execute Block,发现效果不错。
开始一直以为Execute
Block用于Procedure,后来仔细看文档才知道,实际用于客户端。
当你在客户端组织比较复杂的数据,又不想写一个存储过程(比如,你的sql语句需要临时组成,而execute
statement又有局限时)就可以用它。换句话说,就是你在客户端临时写个procedure。
举例如下:
表:user_table
id  name salary
===========
1  唐僧   1500

孙悟空  1000
3  猪八戒  800

沙和尚  700

为了显示词语句功能的强大,假定要求:
需要给工资低于1000的人加上15%,
高于1000的加上10%,
如果传入参数x=1,则高于1500的不加薪,否则加薪5%。
最后返回工资增加的总数额。

你可以在客户端执行这样一条语句:
EXECUTE
BLOCK (X INTEGER = :X) RETURNS (Y INTEGER)
  AS
  DECLARE fid
INTEGER;
  DECLARE fsalary INTEGER;
  DECLARE ftotal
INTEGER;
  BEGIN
   SELECT SUM(salary) FROM user_table
     INTO
:ftotal;

   FOR SELECT id, salary FROM user_table
   INTO :fid,
:fsalary
   DO
   BEGIN
    IF (:fsalary < 1000) THEN
     UPDATE
user_table SET salary = salary *1.15 WHERE id = :fid;
    ELSE
      IF
((:fsalary >= 1000) and (:fsalary < 1500)) THEN
       UPDATE
user_table SET salary = salary *1.1 WHERE id = :fid;
      ELSE
       IF
(X = 1) THEN
       UPDATE user_table SET salary = salary *1.05 WHERE id =
:fid;
   END

   SELECT SUM(salary) - :ftotal FROM user_table INTO :Y;


   SUSPEND;
  END

在IBExpert中执行顺利,只是感觉第一次执行时非常慢,可能需要做后台编译吧。
至于其它的客户端暂时没有试过,有兴趣的话,请大家试过之后报告一下结果。
最希望了解在DBExpress,
IBX, FIBPlus中的执行情况。

另,感觉使用Execute
Block功能可以大大减少客户端的编程量,又避免了procedure不能根据客户端实际灵活进行调整,Execute
Statement有限制的状况。希望大家在使用后,能交流些经验。
posted on 2011-03-13 00:07  fyen  阅读(927)  评论(2编辑  收藏  举报