熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

oracle使用游標觸發器的存儲過程

2013-11-13 15:52:23  來源: Oracle 

  create or replace procedure Pro_rateCalculate as

  declare

  v_sc_id     dim_service_centersc_id%TYPE; 聲明一個臨時變量用來存儲維修中心id

  v_count    number; 存儲三個月內不合格的數量

  v_allcount number; 存取三個月內不合格的數量

  v_count    number; 存取時間差若改值大於表示是六個月之前的維修中心

  v_allcount 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; 如果讀到最後則退出

  select count(*) 計算主表中連續三個月不合格的數據的條數

  into v_count

  from dim_service_center

  inner join fact_repair_sheet on dim_service_centersc_id =

  fact_repair_sheetsc_id

  inner join fact_vefpart on fact_vefpartrepid =

  fact_repair_sheetrepair_sheet_id

  where ((fact_vefpartvef_result = 初核結果為不合格

  and fact_vefpartMAJOR_FLAG = ) 且不需要進行復核

  or (fact_vefpartvef_result = )) 或者復核結果為不合格

  and fact_vefpartismajor = 且是主要備件

  and fact_repair_sheetclose_date > Add_months(sysdate )為三個月內的數據

  and dim_service_centersc_id = v_sc_id;

  v_allcount := v_count; 把不合格的備件數據的數量賦值給總數量計數器

  select count(*) 計算電話回訪中連續三個月不合格的數據條數

  into v_count

  from fact_verify

  inner join fact_repair_sheet on fact_verifyrepid =

  fact_repair_sheetrepair_sheet_id

  inner join dim_service_center on dim_service_centersc_id =

  fact_repair_sheetsc_id

  where fact_verify

  CALLSTATUS = 不合格 回訪不合格

  and fact_repair_sheetclose_date > Add_months(sysdate )三個月內

  and dim_service_centersc_id = v_sc_id;

  v_allcount := v_allcount + v_count; 計算連續三個月總的不合格數量

  

  select count(*) 計算主表中連續六個月不合格的數據的條數

  into v_count

  from dim_service_center

  inner join fact_repair_sheet on dim_service_centersc_id =

  fact_repair_sheetsc_id

  inner join fact_vefpart on fact_vefpartrepid =

  fact_repair_sheetrepair_sheet_id

  where ((fact_vefpartvef_result = 初核結果為不合格

  and fact_vefpartMAJOR_FLAG = ) 且不需要進行復核

  or (fact_vefpartvef_result = )) 或者復核結果為不合格

  and fact_vefpartismajor = 且是主要備件

  and fact_repair_sheetclose_date > Add_months(sysdate )六個月內

  and dim_service_centersc_id = v_sc_id;

  v_allcount := v_count; 把不合格的備件數據的數量賦值給總數量計數器

  select count(*) 計算電話回訪中連續六個月不合格的數據條數

  into v_count

  from fact_verify

  inner join fact_repair_sheet on fact_verifyrepid =

  fact_repair_sheetrepair_sheet_id

  inner join dim_service_center on dim_service_centersc_id =

  fact_repair_sheetsc_id

  where fact_verify

  CALLSTATUS = 不合格 回訪不合格

  and fact_repair_sheetclose_date > Add_months(sysdate )

  and dim_service_centersc_id = v_sc_id;

  v_allcount := v_allcount + v_count; 計算連續六個月總的不合格數量

  select Add_months(sysdate ) creation_date

  into v_datediff

  from dim_service_center

  where sc_id = v_sc_id;

  if v_allcount > then

  v_rate := ;

  elsif v_allcount > then

  v_rate := ;

  elsif v_allcount = then

  v_rate := ;

  end if;

  if (v_allcount = ) then

  v_rate := ;

  end if;

  if (v_datediff < ) then

  v_rate := ;

  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 sysdate sysdate);

  end loop;

  close cur_sc_id;

  end;


From:http://tw.wingwit.com/Article/program/Oracle/201311/17432.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.