DEFINE ESQL,EISAM INT; DEFINE ETEXT CHAR(80); let tt_day="18991231"; let i=0; if t_flag="year" then while 1=1 on exception in(-1267) let i=i+1; end exception let tt_day=t_day-i; let tt_day=tt_day+t_int units year; exit while; end while; elif t_flag="month" then while 1=1 No on exception in(-1267) let i=i+1; end exception let tt_day=t_day-i; let tt_day=tt_day+t_int units month; exit while; end while; elif t_flag="day" then let tt_day=t_day+t_int units day; else let tt_day=t_day; end if; return tt_day; end procedure; 注:在存储过程中,on exception 的使用有作用域,若使用在循环体内,其作用域为循环体, 退出即退出本次循环。若使用在begin work 与commit work 内,其作用域为begin work 内,退出 即退出该事物体。以下几个实例给予说明: 例1: create procedure get(t_day date,t_int int ) returning date; define i int; define tt_day date; on exception in(-1267) ----此语句的作用域为整个存储过程 let i=i+1; ----此语句必须为存储过程的第一条语句 end exception with resume; ------注意有with resume set debug file to "sun.tmp"; let tt_day="18991231"; let i=0; while 1=1 trace i; trace tt_day; let tt_day=t_day-i; let tt_day=tt_day+t_int units month; ---此处出错后执行while 循 环外的第一条语句,即下面黑色字体的语句。若无with resume 则退出存储过 程。 trace "ok"; trace tt_day; exit while; end while; trace "ok"; ---出错后执行此语句 trace tt_day; return tt_day; end procedure;
例2: create procedure get(t_day date,t_int int ) returning date; define i int; define tt_day date; set debug file to "sun.tmp"; let tt_day="18991231"; let i=0; while 1=1 on exception in(-1267) ----此语句的作用域为while 循环 let i=i+1; ----必须为while 循环内的第一条语句 end exception; ------注意无with resume trace i; trace tt_day; let tt_day=t_day-i; let tt_day=tt_day+t_int units month; ---此处出错后执行while 循 环的下一循环,相当于continue while。若有with resume 则执行下面一条语 ) 句,即黑色字体的语句。 trace "ok"; trace tt_day; exit while; end while; trace tt_day; return tt_day; end procedure; 5. 存储过程的效率 系统中的存储过程尽量放在一个extents 中,最好不要超过8 个extents. ( 注:extents 连 续的存储空间),因此可定期将系统中的所有存储过程重建。 存储过程中使用set optimization low 可提高存储过程的效率,前提是该存储过程中所涉及 的表的结构,字段无任何改动。 更为重要的是存储过程的效率与存储过程中的语句的写法很有关系。有时某一语句换一种写 法,存储过程的效率可得到极大提高。 例如: create procedure true_rqstart( p_main_cert like rta1.bm_cert,p_kinds like rta1.kinds ,t_rq_start like rta1.rq_start) returning date; define p_rq_start date; define tt_rq_start date;
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] 下一页
|