今天稍微研究了一下Execute Block,发现效果不错。
开始一直以为Execute
Block用于Procedure,后来仔细看文档才知道,实际用于客户端。
当你在客户端组织比较复杂的数据,又不想写一个存储过程(比如,你的sql语句需要临时组成,而execute
statement又有局限时)就可以用它。换句话说,就是你在客户端临时写个procedure。
举例如下:
表:user_table
id name salary
===========
1 唐僧 1500
2
孙悟空 1000
3 猪八戒 800
4
沙和尚 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有限制的状况。希望大家在使用后,能交流些经验。
开始一直以为Execute
Block用于Procedure,后来仔细看文档才知道,实际用于客户端。
当你在客户端组织比较复杂的数据,又不想写一个存储过程(比如,你的sql语句需要临时组成,而execute
statement又有局限时)就可以用它。换句话说,就是你在客户端临时写个procedure。
举例如下:
表:user_table
id name salary
===========
1 唐僧 1500
2
孙悟空 1000
3 猪八戒 800
4
沙和尚 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有限制的状况。希望大家在使用后,能交流些经验。