当前位置:首页 > 如何编写INFORMIX的存储过程
procedure wd_test_no_excep returns running failed!
iteration of cursory procedure wd_test_no_excep
7、5月11日,同广州电信讨论INFORMIX存贮过程的编写,需确认以下问题: 1)把存贮过程作为参数进行传递;(可以) 2)函数作为参数进行传递;(可以) 3)参数的数据类型用字段类型;(可以) 4)定义常量、宏;??
5)提取序列号,SWQUENCE转SERIAL;(可以)
在执行了INSERT语句后,函数DBINFO(‘SQLCA.SQLERRD1‘)返回新增行的序列号字段值。
6)数据类型的转换;?? 7)规范文档;??
8)在子过程中可直接使用父过程所定义的DEBUG FILE文件;(可以) 9)修改子过程后,不必重新编译父过程;??(不可以)
由于重新编译存贮过程前必须先将其DROP掉,因而重新编译后即使存贮过程的名称不变,但在数据库中的ID号已变化;因此父过程在运行时将找不到重新编译后的子过程,INFORMIX报721号错误。解决方法是由下向上重新编译所有调用了该过程的上级存贮过程。
奇怪现象:不重新编译,第一次执行父过程,运行出错;再执行一次,可正常运行。 10) RETURNING参数不可省略;?? 11) 未查询到记录时,INFORMIX不报错。
结论:参数可用表达式来代替,表达式中可包含存贮过程(必须只有一个返回值)、函数等,
{ 测试主程序 }
drop procedure wd_test_main;
create procedure wd_test_main() returning int; --使用了RETURNING后,要加分号。
define i int; define num int;
define flag int; -- boolean; -- 不能使用布尔类型。 define mess char(100);
define sql_err int; define isam_err int;
define error varchar(200);
-- 设置通用出错陷阱;
ON EXCEPTION SET sql_err, isam_err, error TRACE 'SQL err no '||sql_err; TRACE 'ISAM err no '||isam_err;
TRACE 'error message is \ TRACE 'end running with error.'; END EXCEPTION ;
SET DEBUG FILE TO '/export/cq97/debug_wd'; -- 以后所有的TRACE语句,包括子过
程,均写入该文件。
trace \
-- 新增一用户,返回序列号;
-- begin work; -256错误号,本库无日志,不能执行事务处理。 let i=1;
call wd_test_add_cust('wd',wd_test_add_3(i)+1) -- 表达式作为参数 returning flag,mess,num; -- 返回时,必须把所有参数写齐。 if flag=0 then
trace \ -- rollback; return; else
trace \ -- commit work; end if;
-- 查不到数据是否报错?---- 不报错
select fname into error from customer where fname = 'wdwdwd'; if dbinfo(\
trace \未找到满足条件的记录,不报错,SQLERRD2=\-- 实际
运行时,此条语句被执行,表示未找到记录属于正常情况,不报错。
else
trace \找到记录 lname = \ end if;
-- BEGIN...END中间的陷阱是否被触发?-- 外部错误不能触发。 begin
on exception
trace \ -- 实际测试,该语句未被执行, end exception; end;
raise exception -99;
trace \ return num; end procedure;
-------------------------------------------------------------------
create procedure wd_test_add_3(i int) returning int; return i+4; end procedure;
-------------------------------------------------------------- { 功能:在CUSTOMER表中新增一个用户 输入:FNAME, LNAME;
返回:用户号,CUSTOMER-NUM 表:CUSTOMER }
drop procedure wd_test_add_cust; create procedure wd_test_add_cust
(fname varchar(20), lname like customer.lname) returning int,varchar(100),int;
define flag int;
define mess varchar(100); define sql_err int; define isam_err int;
define error varchar(200);
-- 设置通用出错陷阱;
ON EXCEPTION SET sql_err, isam_err, error let mess='sql_err='||sql_err||' error= '||error; return 0,mess,0; END EXCEPTION ;
let flag=3;
trace \ -- 使用父过程的DEBUG FILE。
insert into customer(customer_num,fname,lname) values(0,fname,lname);SERIAL字段的处理 return 1,'',dbinfo(\; -- 返回数据库分配的序列号值。 end procedure;
8、在TRIGGER中修改记录值(2000/5/16)
使用“EXECUTE PROCEDURE name(,,,) INTO v1,v2…,vn;”语句,可在INSERT TRIGGER中修改任意字段的值;但对于UPDATE TRIGGER,也可以修改触发字段的值。
使用字段数据类型时要注意,字符串的空格也要加到变量上;
--- 追踪TRIGGER 的运行 ------------ drop procedure wd_update_fire;
create procedure wd_update_fire() returning char(10); on exception
return \ end exception;
set debug file to \ ;只能在存贮过程中建立DEBUG文件,追踪。 trace on;
update customer set fname=\--写一个存贮过程,进行追踪 trace off;
return \end procedure;
-- 测试UPDATE TRIGGER --------------------- drop trigger wd_test_update_t; create trigger wd_test_update_t update of fname on customer referencing new as n old as o for each row
( execute procedure wd_test_update(o.fname) into fname --直接修改触发字段,实验成功。 );
-- 配合TRIGGER wd_test_update_t,测试修改触发字段。--------- drop procedure wd_test_update;
create procedure wd_test_update(i_fname like customer.fname) returning varchar(50); define char1 varchar(50);
let char1 = trim(i_fname)||\ -- i_fname定义为字段类型,输入变量的的值包含空
格,直至字段的长度。实验CHAR、VARCHAR类型,也是同样的情况?
return char1; end procedure;
9、游标FOREACH中,记录数的确定 drop procedure wd_dbinfo_test; create procedure wd_dbinfo_test() define sql_err int; define isam_err int;
define error varchar(200); define i,j,k int;
define c_fname char(20);
ON EXCEPTION SET sql_err, isam_err, error
共分享92篇相关文档