- 爱易网页
-
Oracle教程
- orcal分类统计(PLSQL)———急解决方案
日期:2014-05-17 浏览次数:20952 次
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));