日期:2014-05-17  浏览次数:20872 次

orcal分类统计(PLSQL)———急急急急急!!!
我有三张表zkf,zkf_temp,md_cost_item我要实现的目标是把zkf中的数据经过分类统计插入到zkf_temp中,md_cost_item中提供一些跟编码相关的信息。
具体业务逻辑如下:zkf中有重要字段item_id,pur_date,prod_id,ent_id。其中item_id用来区分产品,按级别不同其长度可能有9,7,5,3三种,pur_date采用turnc函数取到月份,我的操作思路是这样的:先用游标遍历zkf,对其中的每条记录的item_id都进行拆分(拆分时根据md_cost_item中的inner_level字段进行,如果inner_level为四那么要分成9,7,5,3插入到zkf_temp中,zkf_temp中不允许有这样的记录:同item_id,prod_id,pur_date,ent_id),然从zkf_temp中查询如果有相同的则更新字段qty,没有则插入一条新记录。可我的代码不能实现不知问题出在哪
create or replace procedure pro_zy is
  cursor zkf_cur1 is select * from ZKF for update;
  cur_recp zkf_cur1%rowtype;
  v_zkf_lev1 zkf%rowtype;
  v_zkf_lev2 zkf%rowtype;
  v_zkf_lev3 zkf%rowtype;
  v_zkf_lev4 zkf%rowtype;
  v_zkf_temp zkf_temp%rowtype;
  v_zkf_temp1 zkf_temp%rowtype;
  v_zkf_temp2 zkf_temp%rowtype;
  v_zkf_temp3 zkf_temp%rowtype;
  v_zkf_temp4 zkf_temp%rowtype;

  ent_id zkf.ent_id%type;
  prod_id zkf.prod_id%type;
  line_no zkf.line_no%type;
  item_id zkf.item_id%type;
  qty zkf.qty%type;
  pur_date zkf.pur_date%type;
  measure zkf.measure%type;
  total_amt zkf.total_amt%type;
  manage_id zkf.manage_id%type;
--定义层次  
  v_inner_lev integer;
  v_inner_lev1 integer;
  v_inner_lev2 integer;
  v_inner_lev3 integer;
  v_inner_lev4 integer;
--剪切id  
  item_id_temp1 md_cost_item.item_id%type;
  item_id_temp2 md_cost_item.item_id%type;
  item_id_temp3 md_cost_item.item_id%type;
  item_id_temp4 md_cost_item.item_id%type;
--日期处理
  v_date1 zkf.pur_date%type;
  v_date2 zkf.pur_date%type;
--截取月和年:
  v_nyear number;
  v_nmonth number;
  --定义记录类型用于函数中存记录  
  TYPE recordRec IS RECORD(
  cost_id zkf_temp.cost_id%type,
  ent_id zkf_temp.ent_id%type,
  nyear zkf_temp.nyear%type,
  nmonth zkf_temp.nmonth%type,
  ndate zkf_temp.ndate%type,
  prod_id zkf_temp.prod_id%type,
  item_id zkf_temp.item_id%type,
  prod_sort_id zkf_temp.prod_sort_id%type,
  cost_type zkf_temp.cost_type%type,
  line_no zkf_temp.line_no%type,
  measure zkf_temp.measure%type,
  qty zkf_temp.qty%type,
  price zkf_temp.price%type,
  rmb_amt zkf_temp.rmb_amt%type,
  ass_amt zkf_temp.ass_amt%type,
  total_amt zkf_temp.total_amt%type,
  src_tyep zkf_temp.src_type%type,
  sum_type zkf_temp.sum_type%type,
  manage_id zkf_temp.manage_id%type
  );
  TYPE recordTab IS TABLE OF recordRec INDEX BY BINARY_INTEGER; 
  availableRecordTab recordTab; 
--创建函数
  function select_record(entId in varchar2,prodId in varchar2,itemId in varchar2,costType in char,sumType in char,Ndate in char) return boolean is
  begin
  select cost_id,ent_id,nyear,nmonth,ndate,prod_id,item_id,prod_sort_id,cost_type,line_no,measure,qty,price,rmb_amt,ass_amt,total_amt,src_type,sum_type,manage_id BULK COLLECT INTO availableRecordTab from zkf_temp where (ent_id=entId)and(prod_id=prodId)and(item_id=itemId)and(cost_type=costType)and(sum_type=sumType)and(ndate=Ndate);
  return true;
  exception
  when others then
  return false;
  end;
begin
  for cur_recp in zkf_cur1 loop
  v_date1:=trunc(to_date(cur_recp.pur_date,'yyyy-MM-dd'),'month');
  v_nyear:=to_number(substr(cur_recp.pur_date,0,4));
  v_nmonth:=to_number(substr(cur_recp.pur_date,6,2));