oracle使用游标触发器的存储过程- 大学生计算机技术网- cccbbs.net
  create or replace procedure Pro_rateCalculate as

  --declare

  v_sc_id     dim_service_center.sc_id%TYPE; --声明一个临时变量,用来存储维修中心id

  v_count3    number; --存储三个月内不合格的数量

  v_allcount3 number; --存取三个月内不合格的数量

  v_count6    number; --存取时间差,若改值大于0表示是六个月之前的维修中心

  v_allcount6 number;

  v_datediff  number;

  v_rate      number;

  cursor cur_sc_id is

  select sc_id from dim_service_center; --声明一个游标,此游标查出的是维修中心id

  begin

  open cur_sc_id;

  LOOP

  FETCH cur_sc_id

  INTO v_sc_id; --读取一个游标数据到v_sc_id

  EXIT WHEN cur_sc_id%NOTFOUND; --如果读到{zh1}则退出

  select count(*) --计算主表中连续三个月不合格的数据的条数

  into v_count3

  from dim_service_center

  inner join fact_repair_sheet on dim_service_center.sc_id =

  fact_repair_sheet.sc_id

  inner join fact_vefpart on fact_vefpart.repid =

  fact_repair_sheet.repair_sheet_id

  where ((fact_vefpart.vef_result1 = '2' --初核结果为不合格

  and fact_vefpart.MAJOR_FLAG = '2') --且不需要进行复核

  or (fact_vefpart.vef_result2 = '2')) --或者复核结果为不合格

  and fact_vefpart.ismajor = '1' --且是主要备件

  and fact_repair_sheet.close_date > Add_months(sysdate, -3)--为三个月内的数据

  and dim_service_center.sc_id = v_sc_id;

  v_allcount3 := v_count3; --把不合格的备件数据的数量赋值给总数量计数器

  select count(*) --计算电话回访中连续三个月不合格的数据条数

  into v_count3

  from fact_verify

  inner join fact_repair_sheet on fact_verify.repid =

  fact_repair_sheet.repair_sheet_id

  inner join dim_service_center on dim_service_center.sc_id =

  fact_repair_sheet.sc_id

  where fact_verify.

  CALLSTATUS = '不合格' --回访不合格

  and fact_repair_sheet.close_date > Add_months(sysdate, -3)--三个月内

  and dim_service_center.sc_id = v_sc_id;

  v_allcount3 := v_allcount3 + v_count3; --计算连续三个月总的不合格数量

{zx1}评论

  -------------------------------------------------

  select count(*) --计算主表中连续六个月不合格的数据的条数

  into v_count6

  from dim_service_center

  inner join fact_repair_sheet on dim_service_center.sc_id =

  fact_repair_sheet.sc_id

  inner join fact_vefpart on fact_vefpart.repid =

  fact_repair_sheet.repair_sheet_id

  where ((fact_vefpart.vef_result1 = '2' --初核结果为不合格

  and fact_vefpart.MAJOR_FLAG = '2') --且不需要进行复核

  or (fact_vefpart.vef_result2 = '2')) --或者复核结果为不合格

  and fact_vefpart.ismajor = 1 --且是主要备件

  and fact_repair_sheet.close_date > Add_months(sysdate, -6)--六个月内

  and dim_service_center.sc_id = v_sc_id;

  v_allcount6 := v_count6; --把不合格的备件数据的数量赋值给总数量计数器

  select count(*) --计算电话回访中连续六个月不合格的数据条数

  into v_count6

  from fact_verify

  inner join fact_repair_sheet on fact_verify.repid =

  fact_repair_sheet.repair_sheet_id

  inner join dim_service_center on dim_service_center.sc_id =

  fact_repair_sheet.sc_id

  where fact_verify.

  CALLSTATUS = '不合格' --回访不合格

  and fact_repair_sheet.close_date > Add_months(sysdate, -6)

  and dim_service_center.sc_id = v_sc_id;

  v_allcount6 := v_allcount6 + v_count6; --计算连续六个月总的不合格数量

  select Add_months(sysdate, -6) - creation_date

  into v_datediff

  from dim_service_center

  where sc_id = v_sc_id;

  if v_allcount3 > 2 then

  v_rate := 100;

  elsif v_allcount3 > 1 then

  v_rate := 50;

  elsif v_allcount3 = 0 then

  v_rate := 20;

  end if;

  if (v_allcount6 = 0) then

  v_rate := 5;

  end if;

  if (v_datediff < 0) then

  v_rate := 50;

  end if;

  insert into VEF_FUHERATE

  (vef_fuherate_id,

  scid,

  auto_rate,

  change_rate,

  status,

  modify_status,

  createdate,

  updatedate)

  values

  (sys_guid(), v_sc_id, v_rate, v_rate, '1', '0', sysdate, sysdate);

  end loop;

  close cur_sc_id;

  end;
郑重声明:资讯 【oracle使用游标触发器的存储过程- 大学生计算机技术网- cccbbs.net】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——