当前位置:首页 > 如何编写INFORMIX的存储过程
TRACE 'SQL err no '||sql_err; TRACE 'ISAM err no '||isam_err; TRACE 'error message is \ TRACE 'end running with error.'; END EXCEPTION with resume;
SET DEBUG FILE TO 'debug_wd'; trace on;
select fname into error from customer ; --where fname = 'wwww'; trace 'dbinfo = '||dbinfo('sqlca.sqlerrd2');
foreach select fname into c_fname from customer where fname like \
{ update customer set fname=\;-- 无满足此条件的语句
let i=dbinfo(\ -- 实际测试为0,然后立即退出循环,这时J的值也是
0,J不等于K。
exit foreach; }
let i=dbinfo(\-- FOREACH内测试 end foreach;
let j=dbinfo(\ -- FOREACH外测试
select count(*) into k from customer where fname like \; 直接计数
trace \ trace \
trace 'count(*) = '||k; -- 实际测试,J和K的值保持一致。 trace \end procedure;
10、调用存贮过程时的参数匹配 返回字符时,包含空格?
11、取系统时钟及时间的运算 进入存贮过程后,每次取系统时钟,CURRENT函数都返回同一时间值,不再发生变化;但第二次进入时,CURRENT函数返回不同的时间值。所以,要在同一存贮过程中动态地提取时间,只有专门写一个提取时间的存贮过程,调用后得到变化的时间值。
12、把系统出错号改为自定义的出错号
{ 创建数组 ARRAY-CREATE()
功能:建立一个字符类型的临时表temp_table_char;如果一存在该表,则清空表中的数据; 该临时表由两个字段组成,一个是序号字段,代替数组的下标;另一个为真正的变量。 输入:无
输出:布尔值,成功与否的标志。
}
drop procedure array_create;
CREATE procedure array_create() RETURNING int; DEFINE char_VAL VARCHAR(100);
on exception -- 在on exception可再写RAISE语句,不会死循环,由外部的陷阱处理 raise exception -9998,0,\所有其他错误均统一改成-9998\ -- 经测试,可用。 return 0; end exception;
on exception in (-310) -- Table table-name already exists in database delete from temp_table_char; end exception with resume;
CREATE TEMP TABLE temp_table_char(NUM INT PRIMARY KEY, VAL varchar(100)); raise exception -9990,0,\ RETURN 1; END PROCEDURE;
13、CREATE PROCEDURE 的语法 create procedure sp_array_write
(in_array_id int, in_num int, in_val varchar(200)) ?此处不能加分号;对于returning
相当于是一条独立的语句,要加分号。
语句块; end procedure;
14、SUBSTR的使用
substr(字符变量,起点,截取长度)
当“起点”是负数,且值大于字符串的长度,INFORMIX SERVER死机。重复实验多遍,无一例外。左老师说可能是UNIX未打补丁程序。
由于substr 超界会产生NULL值,而一旦表达式中出现NULL值,则整个表达式的值为NULL,故此必须对substr后的结果进行NVL判断,否则程序可能出现意想不到的错误。
15、FOREACH中的RETURN语句 drop procedure wd_test_order_by;
create procedure wd_test_order_by() returning varchar(100); define i,j int;
define tmp_fname varchar(100); --------------------------------------------- let i, j = 10, 10 ; ?同时赋值; let tmp_fname = \
foreach select item_num,min( total_price – i ) ? 求运算后金额最小的定单号; into tmp_fname, j from items
group by item_num
order by 2 ? 此处用列的编号或别名; let i=1;
return \dbinfo(\?FOREACH中return可以正常返回; ||\ item_num = \ end foreach; end procedure;
运行结果: (expression) sqlca.sqlerrd2=0 item_num = 5
16、李蒺:ORDER BY 的使用
select item_num,min(abs(total_price)-10) from items group by item_num order by 2; 通过此条语句可找到总金额最小(表达式,在存贮过程中可加变量)的定单号。
17、LPAD、RPAD函数
18、FOR 循环
在测试程序过程发现 :
而在oracle中, 对于 FOR I IN A .. B LOOP END LOOP;
I 变量缺省以升序进行处理,若A > B ,则不进入循环体内。
而在INFORMIX 中,对于 FOR I= A TO B END FOR;
的循环,若A > B ,则 I 变量会自动以降序进行处理,并进入循环体内执行程序, 从而引起错误。
所以INFORMIX 中,若A, B 以变量的形式定义,则要对A,B 的大小进行判断,方法有二: 1) 增加判断语句: IF A >= B THEN FOR I= A TO B END FOR; END IF;
2) 增加STEP 1 ,并对每一个FOR 循环 增加对应的on exception in (-683) 语句。 当 A > B 时,若 增加 STEP 1 , FOR I = A TO B STEP 1 ,则会出现 -683 错误, 所以程序前要增加
on exception in (-683) -- null;
end exception with resume;
特别的,对于两重循环,还要在内循环前增加 on exception in (-683) 语句。如
on exception in (-683) -- null;
end exception with resume; 。。。 。。。 。。。
for j=1 to 5 begin
on exception in (-683) -- null;
end exception with resume; for i =a to b step 1
end for; end;
end for;
共分享92篇相关文档