当前位置:首页 > 如何编写INFORMIX的存储过程
系统检查数据库服务器内存中的字典,查找该表的触发器及正在执行SQL语句类型。如果触发器存在,则将其检索出来,优化,并由数据库服务器在恰当的时候执行。
INFORMIX三类触发:指定事件发生之前(BEFORE)、指定事件触发每行数据后(FOR EACH
ROW)、指定事件完成后(AFTER)。
创建一个触发器,需要注意以下几点:
触发器命名(CREATE TRIGGER trigger_name);
定义触发器事件,即表名和启动触发器操作的施加于表上的动作类型(UPDATE、
INSERT、DELETE ON 表名);
定义触发时间点:before, after, for each row 定义触发执行的SQL语句;
--drop trigger ti_ts;
CREATE TRIGGER ti_ts INSERT ON ts referencing new as post for each row
(EXECUTE PROCEDURE ti_ts_proc(post.id,post.dw,post.status,post.sign) );
在TRIGGER中可把当前记录的数据传给存贮过程,也可由存贮过程返回数据给当前记录中的部分字段(Nontriggering Columns)。
CREATE TRIGGER upd_totpr
UPDATE OF quantity ON items
REFERNCING OLD AS pre_upd NEW AS post_upd FOR EACH ROW
(EXECUTE PROCEDURE calc_totpr
(pre_upd.quantity, Post_upd.quantity, pre_upd.total
) INTO total_price );
The total_price column is updated for each row that the triggering statement affects.
USING the WHEN Condition
CREATE TRIGGER upd_totpr
UPDATE OF quantity ON items
REFERNCING OLD AS pre_upd NEW AS post_upd
FOR EACH ROW WHEN (post_upd.quantity>=pre_upd.quantity*1.3)
(EXECUTE PROCEDURE calc_totpr
(pre_upd.quantity, Post_upd.quantity, pre_upd.total
) INTO total_price
);
六、错误调试
1、字符变量必须赋给非空的初值,否则参与所有运算后其值都是NULL;
let index,str1=1,null; --》应将STR1的值改为‘’; while index<=length(new_pass)
let v_pass=(char_ascii(substr(new_pass,index,1))-ms_sum); let str1=str1||v_pass;
trace 'str1='||str1; ---》其值始终为NULL; let index=index+1; end while;
-------------------------------- drop procedure sp_wd1 create procedure sp_wd1() returning varchar(100);
define tmp_return varchar(100) ; let tmp_return = null;
IF nvl (SUBSTR(tmp_return, 1, 1), 0) = '0' THEN RETURN \ else RETURN \ END IF; end procedure;
运行结果:(expression) nvl(SUBSTR(tmp_return,1,1),0) = '0': true
当 IF 判断条件中有NULL值时,因运算结果为NULL,故判断出的结果始终不为1,即是FALSE。如:
if tmp_return<>0 then ..... else
..... (不论判断条件是等于或是不等于0, 程序都进入FALSE分支。) end if ;
2、对视图的增、删、改操作(with check option)
对视图增、删、改的操作结果与视图的定义有一定的关系;
3、查看一张表的权限情况
select * from sysmaster:systabauth where tabid= (select tabid from systables where tabname='ts' );
查询结果:
grantor grantee tabid tabauth informix public 118 s-------
只有SELECT权限;
4、并发操作时的锁机制
shared lock(共享锁):在共享锁有效期间不允许被修改;一个数据对象上(表、字段等)可加载多个共享锁。
exclusive lock(排它锁): promotable lock():
如何判断操作是否成功?
5、事务处理
存贮过程中每COMMIT 或 ROLLBACK一次,则所有打开的游标都被关闭。
6、没有ON EXCEPTION语句,出错怎么办?
如果存贮过程中无ON EXCEPTION语句,当出现异常时,直接退出存贮过程。
在父过程中有ON EXCEPTION语句而子过程中没有,当子过程中有异常出现时,子过程中断运行,错误号被父过程的ON EXCEPTION语句捕获,由有父过程错误处理语句进行处理。
-------- 子过程 -------------------------------- drop procedure wd_test_multi_line;
create procedure wd_test_multi_line() returning varchar(100); define name like customer.fname;
select fname into name from customer; -- 无WHERE子句,有多个返回值,出错284
号,存贮过程由此返回,剩下的语句不执行。
trace \ let name=\ return name; end procedure;
-------- 父过程 --------------------------------- drop procedure wd_test_no_excep;
create procedure wd_test_no_excep() returning varchar(100); define ch1 varchar(100); define i,j int;
on exception set i,j,ch1
trace \ j=\ ch1=\ return \ end exception;
set debug file to \ trace on;
let ch1=today;
let ch1=wd_test_multi_line(); --调用无ON EXCEPTION的子存贮过程。 trace off; return ch1; end procedure;
----------------------------------------------------- 调试文档: trace on
let ch1 = 01/07/1997
execute procedure cq97.wd_test_multi_line () exception : looking for handler
SQL error = -284 ISAM error = 0 error string = = \; -- 在子过程中的出错信息 exception : no appropriate handler exception : looking for handler
SQL error = -284 ISAM error = 0 error string = = \exception : handler FOUND
expression:(|| (|| (|| (|| (|| \ j=\ ch1=\evaluates to i=-284 j=0 ch1=
trace expression :i=-284 j=0 ch1= ;-- 在父过程中的错误处理
共分享92篇相关文档