informix存储过程_informix的存储过程
informix存储过程由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“informix的存储过程”。
INFORMIX数据库存储过程编写讲义
一、存储过程概念
sql语句执行的时候要先编译,然后执行。存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
二、标准语法格式
1、创建带参数存储过程
Create PROCEDURE “npmuser”.sp_sx_sum_ctr_traf_proc(tch_datetime datetime year to second , i_time integer)returning varchar(40);
--作 者:--创建时间:
--功能简述:统计农村话务量,改过程需要配置在服务器上,每个小时定时执行--提取一个小时的话务量并按所属行政区域分组(农村、城市、县城)--参数描述:tch_datetime 传入时间,i 提取传入时间前i个小时的数据--引用到的其他存储过程或函数:--被以下存储过程引用过:--修改历史:--修 改 人:--修改时间:--修改原因:
select first_result,parent_ne_id,ne_id,related_bsc,related_msc, region_id,province_id from tcc_ne_snap a where a.first_result = tch_datetime and a.ne_type = 300 and confirmed not in(2,5)and resource_status =1 into temp te_ne_snap。。。。。
return 'te_result';end PROCEDURE2、创建不带参数存储过程
Create PROCEDURE “npmuser”.sp_sx_sum_ctr_traf_proc()returning varchar(40);
define TchDatetime datetime year to second;define snap_date datetime year to second;define Schema_id integer。。。。。
return 'te_result';end PROCEDURE3、临时表
第一种方法,先建立临时表,再向临时表插入数据。Create temp te_table(col varchar(100));Insert into …
第二种方法,直接利用查询结果创建临时表。注意查询结果的列必须有列名。Select col_a,col_b,col_c From table Into temp te_table;
4、变量赋值
let snap_date = extend(extend(TchDatetime, year to day),year to second);let Schema_id =-1121449820;
5、调用及删除存储过程
Execute procedure sp_sx_sum_ctr_traf_proc();调用 drop procedure sp_sx_sum_ctr_traf_proc();删除 存储过程可以互相调用。
6、游标
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。
foreach select ne_id,c into v_neid,v_c from te_radio_ne where region_name =v_region_name order by c desc--拥塞率大于5 if v_c > 5 then let v_id_1= v_id_1+1;update te_radio_ne set i_flag = 1 where ne_id= v_neid;--更新row_id列 update te_radio_ne set row_id = v_id_1 where ne_id= v_neid;end if let v_neid = 0;let v_c = 0;end foreach;2
三、网管三期报表实例讲解
1、农村话务量报表
sp_sx_sum_ctr_traf_proc.TXT2、统计市区基站整体指标(c1)报表
sp_sx_sum_traf_proc.txtsp_sx_traffic_proc.TXT3、按地市提取TOPN小区退服总时长及平均时长
sp_sx_drop_site_topn_proc.TXTsp_sx_get_topn.TXT
四、特殊的存储过程
1、函数
INFORMIX中存储过程与函数的区分界限十分模糊。而在其他数据库中,函数(FUNCTION)的建立语法与存储过程区分明显。函数实际上是抽象出一部分使用比较频繁,通用性比较强的存储过程来被其他过程所调用。
实例: 除法函数
create procedure “npmuser”.sfb_divfloat_1(a float, b float, ret0 float default 0.00, ret1 float default-1.00)returning float;define res float;if b = 0 and a = 0 then return ret0;end if;if b = 0 and a0 then return ret1;end if;let res = a/b;return res;end procedure;提取网元名称函数
create procedure “npmuser”.soa_get_nename(id int, type int)returning varchar(64,0);define nename varchar(64,0);define usname varchar(64,0);define zhname varchar(64,0);define cityname varchar(32,0);define provid int;define provname varchar(32,0);define type_flag integer;let provid=-1;select distinct province_id into provid from system_setup;if provid is null or provid=-1 then return “unknown province”;end if;select userlabel into provname from tic_ne_def where ne_type = 10000 and ne_id = provid;if provname is null then let provname=“no name”;end if;if type = 10000 then let nename=provname[1,4];return nename;end if;select distinct zh_label,userlabel into zhname,usname from tcc_ne_frame where ne_type = type and ne_id = id and province_id=provid;if(zhname is null)or(zhname = “”)then let nename=usname;else let nename=zhname;end if;if nename is null then let nename = “no_name”;end if;if(type = 10004 or type = 10003)then let nename = provname[1,4] || “-” || nename;return nename;end if;select count(*)into type_flag
from tia_type_def where type_id = type;if(type_flag = 0)then let nename=“unknown type”;end if;return nename;end procedure;
2、触发器
触发器是在特定条件下执行的特殊的存储过程。特定条件指触发器所依附的表,发生插入、删除、修改等事件时。
其中INSERT是一个触发器事件,表中插入行时触发器被激活,一个表只有一个INSERT触发器,DELETE是一个触发器事件,表中删除行时触发器被激活,一个表只有一个DELETE触发器。UPDATE是一个触发器事件,表中根性列时触发器被激活,如果包括列清单,则更新列清单中的列时触发器被激活。否则更形表中任何列时触发器被激活,一个表可以有多个UPDATE触发器。但是列清单要相互排斥。
触发器包含两种二维数组或者说两条行记录。一种为旧数据(OLD),表示被删除的数据,或者被更新前数据。一种为新数据(NEW),表示新增数据,或更新后数据。
实例: 删除触发器
create trigger tg_delete_dc_bsc_info delete on dc_bsc_info referencing old as a for each row(delete from dc_bsc_info_his where start_time = a.start_time and int_id = a.int_id and compre_date = a.compre_date),(insert into dc_bsc_info_his values(a.insert_time ,a.start_time ,a.stop_time ,a.fill_time ,a.ne_cla,a.ne_name,a.int_id ,a.city_id ,a.sdchh_avail_carrie ,a.sdcch_traffic ,a.sdcch_call_att ,a.sdchh_ai_fail_num ,a.sdchh_call_drop ,a.sdchh_call_block ,a.tch_avail_carrier ,a.tch_traffic ,a.tch_att_num ,a.tch_overflow_num ,a.tch_ai_failed_num ,a.tch_unsuc_num ,a.tch_seize_num ,a.tch_call_att ,a.tch_call_block ,a.tch_failed_ai ,a.tch_call_seize ,a.tch_call_drop ,a.gsm1800_traf ,a.ho_req ,a.ho_succs ,a.worst_cell ,a.avail_cell ,a.acc_cell ,a.sdcch_seize_att ,a.tch_unsuc_call ,a.att_sdcch_seiz ,a.flag ,a.compre_date ,a.vendor_id));新增触发器
create trigger tg_insert_dc_bsc_info insert on dc_bsc_info referencing new as a for each row(delete from dc_bsc_info_bak where start_time = a.start_time and int_id = a.int_id and compre_date = a.compre_date),(insert into dc_bsc_info_bak values(a.insert_time ,a.start_time ,a.stop_time ,a.fill_time ,a.ne_cla,a.ne_name,a.int_id ,a.city_id ,a.sdchh_avail_carrie ,a.sdcch_traffic ,a.sdcch_call_att ,a.sdchh_ai_fail_num ,a.sdchh_call_drop ,a.sdchh_call_block ,a.tch_avail_carrier ,a.tch_traffic ,a.tch_att_num ,a.tch_overflow_num ,a.tch_ai_failed_num ,a.tch_unsuc_num ,a.tch_seize_num ,a.tch_call_att ,a.tch_call_block ,a.tch_failed_ai ,a.tch_call_seize ,a.tch_call_drop ,a.gsm1800_traf ,a.ho_req ,a.ho_succs ,a.worst_cell ,a.avail_cell ,a.acc_cell ,a.sdcch_seize_att ,a.tch_unsuc_call ,a.att_sdcch_seiz ,a.flag ,a.compre_date ,a.vendor_id));更新触发器
create trigger tg_update_alarm update of alarm_state on alarm referencing new as a old as b for each row when(a.alarm_state>0)(INSERT INTO LucentSDH_WG_ALARM values(a.alarm_number,a.node_name,a.fault_location,a.a1_time,'', a.alarm_state,a.fault_type,current,0));
五、其他(关于连接的各种用法)
表test1、表test2结构: test1: test2: node1 property1 node2 property2 1100 a 1100 e 1200 a 1200 b 1300 b 1300 a 1400 d 1500 f
1、内连接 select * from test1 a,test2 b where a.node1=b.node2 结果集: 1100 a 1100 e 1200 a 1200 b 1300 b 1300 a
2、左连接
select * from test1 a left join test2 b on a.node1=b.node2 结果集: 1100 a 1100 e 1200 a 1200 b 1300 b 1300 a 1400 d3、表a左连接表b,且表b加条件
结果集:表b的条件有效且左连接失效(相当于内连接)select * from test1 a left join test2 b on a.node1=b.node2 where b.property2'a' 结果集: 1100 a 1100 e 1200 a 1200 b
4、表a外连接表b,且表b加条件 结果集:表b的条件有效且左连接有效 select * from test1 a,outer test2 b where b.property2'a' and a.node1=b.node2 结果集: 1100 a 1100 e 1200 a 1200 b 1300 b 1400 d
5、右连接
select * from test1 a right join test2 b on a.node1=b.node2 结果集:
test2 test1 1100 e 1100 a 1200 b 1200 a 1300 a 1300 b 1500 f
6、表a右连接表b,且表a有条件 结果集:表a条件有效且右连接失效 select * from test1 a right join test2 b on a.node1=b.node2 where a.property1'a' 结果集: 1300 a 1300 b
7、表b外连接等价于表a右连接表b,且表a有条件 结果集:表a条件有效且右连接有 select * from test2 b,outer test1 a where a.property1'a' 7 and a.node1=b.node2 结果集:
test2 test1 1100 e 1200 b 1300 a 1300 b 1500 f
8、表a右连接表b,且表b有条件 结果集:表b条件有效且右连接有效 select * from test1 a right join test2 b on a.node1=b.node2 where b.property2'a' 结果集: 1100 e 1100 a 1200 b 1200 a 1500 f
9、全外连接
Select * From test1 a full outer join test2 b on a.node1 = b.node2 结果集:
1100 a 1100 e 1200 a 1200 b 1300 b 1300 a 1400 d 1500 f
10、自连接、交叉(无限制)连接(笛卡尔乘积)
自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。例如人力资源数据库中雇员与老板的关系。
Select * from test1 a,test1 b 交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。
大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。
select * from test1 a cro join test2 b 在交叉连接中没有on条件子句