一个Oracle 报表优化运行解决思路
原来有1报表,统计库存,时间比较长
---------------------------------------------------------------------------------------------------------------------------------
create or replace procedure PRO_TJ_STOCK(TRADECODE in varchar2,
User_ID in varchar2) is
row_count integer;
row_count1 integer;
row_count2 integer;
--现已不使用 2009.4.10
cursor cur_stock is
select distinct COP_G_NO,
biz_type,
IE_FLAG,
c.hs_code as HSCODE,
c.G_NAME,
sum(a.qty) as qty,
(select name
from base_dir
where code = biz_type
and type = 'Biz_Type') as BIZ_TYPE_NAME,
(select name
from base_dir
where code = IE_FLAG
and type = 'IE_Mark') as IE_FLAG_NAME
from gj_lineone_list a
inner join sys_merger_relation c on c.part_no = a.cop_g_no
and c.trade_code = TRADECODE
inner join gj_lineone_head b on a.gatejob_no = b.gatejob_no
inner join gj_stock st on st.cop_g_no = a.cop_g_no
and st.trade_code = TRADECODE
where trade_code = TRADECODE
and ((IE_FLAG = '1' and status = 'C06') or
(IE_FLAG = '2' and
(biz_type = 'B' or biz_type = 'C' or biz_type = 'D') and
status in ('K01', 'K02')) or
(IE_FLAG = '2' and biz_type = 'A' and
status in ('C07', 'C06', 'K01', 'K02')) or
(IE_FLAG is null and status = 'C06'))
and st.qty > 0
group by biz_type, IE_FLAG, COP_G_NO, c.hs_code, c.g_name;
CurRow cur_stock%rowtype;
/* FROM 2007-9-4 lily */
--中心内互转 (出)转出(发货)单位
cursor cur_stock1 is
select distinct a.cop_out_no,
biz_type,
--IE_FLAG,
c.hs_code as HSCODE,
c.G_NAME,
sum(a.qty) as qty,
(select name
from base_dir
where code = biz_type
and type = 'Biz_Type') as BIZ_TYPE_NAME,
--(select name from base_dir where code = IE_FLAG and type='IE_Mark') as IE_FLAG_NAME
'' as IE_FLAG_NAME
from gj_center_list a
inner join gj_center_head b on a.gatejob_no = b.gatejob_no
inner join sys_merger_relation c on c.part_no = a.cop_out_no
and c.trade_code = b.ownername
where b.ownername = TRADECODE
and b.status = 'C06'
group by a.cop_out_no,
biz_type,
--IE_FLAG,
c.hs_code,
c.g_name;
CurRow1 cur_stock1%rowtype;
--中心内互转 (进)转入(申请)单位
cursor cur_stock3 is
select distinct a.cop_in_no,
biz_type,
--IE_FLAG,
c.hs_code as HSCODE,
c.G_NAME,
sum(a.qty) as qty,
(select name
from base_dir
where code = biz_type
and type = 'Biz_Type') as BIZ_TYPE_NAME,
--(select name from base_dir where code = IE_FLAG and type='IE_Mark') as IE_FLAG_NAME
'' as IE_FLAG_NAME
from gj_center_list a
inner join gj_center_head b on a.gatejob_no = b.gatejob_no
inner join sys_merger_relation c on c.part_no = a.cop_in_no
and c.trade_code = b.trade_code
where b.trade_code = TRADECODE
and b.status = 'C06'
group by a.cop_in_no,
biz_type,
--IE_FLAG,
c.hs_code,
c.g_name;
CurRow3 cur_stock3%rowtype;
/* TO 2007-9-4 lily */
-- -- 简单加工
cursor cur_stock2 is
select distinct COP_G_NO,
c.hs_code as HSCODE,
c.G_NAME,
sum(a.num) as qty,
a.io_mark
from simpro_info a
inner join sys_merger_relation c on c.part_no = a.cop_g_no
and c.trade_code = TRADECODE
inner join simpro_head b on a.gatejob_no = b.gatejob_no
where b.status = 'C06' and b.trade_code=TRADECODE
group by COP_G_NO, c.hs_code, c.G_NAME, a.io_mark;
CurRow2 cur_stock2%rowtype;
begin
row_count := 0;
delete from TEMP_STOCK where UserID = User_ID;
--commit;
open Cur_Stock;
loop
fetch Cur_Stock
into CurRow;
exit when Cur_Stock%notfound;
--判断有没有重复的料号
select count(*)
into row_count
from TEMP_STOCK
where UserID = User_ID
and COP_G_NO = CurRow.COP_G_NO;
--一线进区业务
if CurRow.biz_type = 'A' and CurRow.IE_FLAG = '1' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, ONELINE_IN_COUNT, USERID, HSCODE, G_NAME)
values
(CurRow.COP_G_NO,
CurRow.qty,
User_ID,
CurRow.HSCODE,
CurRow.G_NAME);
end if;
if row_count = 1 then
update temp_stock
set ONELINE_IN_COUNT = CurRow.qty
where USERID = User_ID
and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--一线出区业务
if CurRow.biz_type = 'A' and CurRow.IE_FLAG = '2' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, ONELINE_OUT_COUNT, Userid, HSCODE, G_NAME)
values
(CurRow.COP_G_NO,
CurRow.qty,
User_ID,
CurRow.HSCODE,
CurRow.G_NAME);
end if;
if row_count = 1 then
update temp_stock
set ONELINE_OUT_COUNT = CurRow.qty
where USERID = User_ID
and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--二线进区业务
if CurRow.biz_type = 'B' and CurRow.IE_FLAG = '1' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, TWOLINE_IN_COUNT, Userid, HSCODE, G_NAME)
values
(CurRow.COP_G_NO,
CurRow.qty,
User_ID,
CurRow.HSCODE,
CurRow.G_NAME);
end if;
if row_count = 1 then
update temp_stock
set TWOLINE_IN_COUNT = CurRow.qty
where USERID = User_ID
and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--二线出区
if CurRow.biz_type = 'B' and CurRow.IE_FLAG = '2' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, TWOLINE_OUT_COUNT, Userid, HSCODE, G_NAME)
values
(CurRow.COP_G_NO,
CurRow.qty,
User_ID,
CurRow.HSCODE,
CurRow.G_NAME);
end if;
if row_count = 1 then
update temp_stock
set TWOLINE_OUT_COUNT = CurRow.qty
where USERID = User_ID
and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--特殊监管进区业务
if CurRow.biz_type = 'C' and CurRow.IE_FLAG = '1' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, SPEC_IN_COUNT, Userid, HSCODE, G_NAME)
values
(CurRow.COP_G_NO,
CurRow.qty,
User_ID,
CurRow.HSCODE,
CurRow.G_NAME);
end if;
if row_count = 1 then
update temp_stock
set SPEC_IN_COUNT = CurRow.qty
where USERID = User_ID
and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--特殊监管出区业务
if CurRow.biz_type = 'C' and CurRow.IE_FLAG = '2' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, SPEC_OUT_COUNT, Userid, HSCODE, G_NAME)
values
(CurRow.COP_G_NO,
CurRow.qty,
User_ID,
CurRow.HSCODE,
CurRow.G_NAME);
end if;
if row_count = 1 then
update temp_stock
set SPEC_OUT_COUNT = CurRow.qty
where USERID = User_ID
and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--分送集报进区业务
if CurRow.biz_type = 'D' and CurRow.IE_FLAG = '1' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, Userid, HSCODE, G_NAME, COLL_IN_COUNT)
values
(CurRow.COP_G_NO,
User_ID,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.qty);
end if;
if row_count = 1 then
update temp_stock
set COLL_IN_COUNT = CurRow.qty
where USERID = User_ID
and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--分送集报出区业务
if CurRow.biz_type = 'D' and CurRow.IE_FLAG = '2' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, Userid, HSCODE, G_NAME, COLL_OUT_COUNT)
values
(CurRow.COP_G_NO,
User_ID,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.qty);
end if;
if row_count = 1 then
update temp_stock
set COLL_OUT_COUNT = CurRow.qty
where USERID = User_ID
and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
commit;
end loop;
close Cur_Stock;
/* 2007-09-04 begin lily */
--中心内互转 (出)发货单位
open Cur_Stock1;
loop
fetch Cur_Stock1
into CurRow1;
exit when Cur_Stock1%notfound;
--判断有没有重复的料号
select count(*)
into row_count1
from TEMP_STOCK
where UserID = User_ID
and COP_G_NO = CurRow1.Cop_Out_No;
--中心内互转 (出)发货单位
--if CurRow1.biz_type='E' then
if row_count1 = 0 then
insert into TEMP_STOCK
(COP_G_NO, Userid, HSCODE, G_NAME, inc_out)
values
(CurRow1.Cop_Out_No,
User_ID,
CurRow1.HSCODE,
CurRow1.G_NAME,
CurRow1.qty);
end if;
if row_count1 = 1 then
update temp_stock
set inc_out = CurRow1.qty
where USERID = User_ID
and COP_G_NO = CurRow1.Cop_Out_No;
end if;
-- end if;
commit;
end loop;
close Cur_Stock1;
--中心内互转 (入)申请单位
open Cur_Stock3;
loop
fetch Cur_Stock3
into CurRow3;
exit when Cur_Stock3%notfound;
--判断有没有重复的料号
select count(*)
into row_count1
from TEMP_STOCK
where UserID = User_ID
and COP_G_NO = CurRow3.Cop_In_No;
--if CurRow1.biz_type='E' then
if row_count1 = 0 then
insert into TEMP_STOCK
(COP_G_NO, Userid, HSCODE, G_NAME, inc_in)
values
(CurRow3.Cop_In_No,
User_ID,
CurRow3.HSCODE,
CurRow3.G_NAME,
CurRow3.qty);
end if;
if row_count1 = 1 then
update temp_stock
set inc_in = CurRow3.qty
where USERID = User_ID
and COP_G_NO = CurRow3.Cop_In_No;
end if;
-- end if;
commit;
end loop;
close Cur_Stock3;
/* 2007-09-04 end lily */
-----简单加工库存查询
open Cur_Stock2;
loop
fetch Cur_Stock2
into CurRow2;
exit when Cur_Stock2%notfound;
--判断有没有重复的料号
select count(*)
into row_count2
from TEMP_STOCK
where UserID = User_ID
and COP_G_NO = CurRow2.COP_G_NO;
if CurRow2.io_mark = '1' then
if row_count2 = 0 then
insert into TEMP_STOCK
(COP_G_NO, Userid, HSCODE, G_NAME, Sip_in)
values
(CurRow2.COP_G_NO,
User_ID,
CurRow2.HSCODE,
CurRow2.G_NAME,
CurRow2.qty);
end if;
if row_count2 = 1 then
update temp_stock
set Sip_in = CurRow2.qty
where USERID = User_ID
and COP_G_NO = CurRow2.COP_G_NO;
end if;
end if;
if CurRow2.io_mark = '2' then
if row_count2 = 0 then
insert into TEMP_STOCK
(COP_G_NO, Userid, HSCODE, G_NAME, Sip_out)
values
(CurRow2.COP_G_NO,
User_ID,
CurRow2.HSCODE,
CurRow2.G_NAME,
CurRow2.qty);
end if;
if row_count2 = 1 then
update temp_stock
set Sip_out = CurRow2.qty
where USERID = User_ID
and COP_G_NO = CurRow2.COP_G_NO;
end if;
end if;
commit;
end loop;
close Cur_Stock2;
Exception
when others then
rollback;
end PRO_TJ_STOCK;
---------------------------------------------------------------------------------------------------------------------------------
这个存储过程实现的功能是把把查询到的符合条件的记录插入的临时表里面插入数据,同时对已经存在的数据,按照查询用户进行更新
由于数据量比较大,每次操作都比较慢
现在考虑使用Job,每次跑一次当天之前的库存,然后每次再跑一个类似的存储过程,每天的业务量总归没有所有的业务量大,
当查询的时候只需要把当天的业务量统计出来
首先建立2个表,用于保存数据
TEMP1_STOCK_1_1 和 temp1_stock_1_1_1 结构与 temp_stock完全一致,用于 保存当天的料号库存(没有经过筛选的) 和 保存当天的料号库存(经过筛选的)的数据
temp_stock 则用于保存今天之前的数据,因为涉及到多个客户,所以需要先把所有客户的的库存跑出来
---------------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE pro_tj_stock_ForJob IS
/******************************************************************************
PURPOSE: 每天跑作业 实现今天之前的报表统计
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2009-04-10 jack.jia 1. Created this procedure.
******************************************************************************/
cursor cur_stock_trade_code is
select trade_code from Sys_Ent where status = 'E02';
CurRow0 cur_stock_trade_code%rowtype;
begin
EXECUTE IMMEDIATE 'truncate table TEMP_STOCK';
open cur_stock_trade_code;
loop
fetch cur_stock_trade_code
into CurRow0;
exit when cur_stock_trade_code%notfound;
--select trade_code into trade_code1 from Sys_Ent where status = 'E02';
--传递客户代码到内层存储过程 用于统计今天之前的数据 并保存到 TEMP_STOCK里面去
PRO_TJ_STOCK_Before(CurRow0.Trade_Code);
end loop;
close cur_stock_trade_code;
end pro_tj_stock_ForJob;
---------------------------------------------------------------------------------------------------------------------------------
create or replace procedure PRO_TJ_STOCK_Before(TRADECODE nvarchar2) is
/******************************************************************************
PURPOSE: 实现今天之前的报表统计
TRADECODE 是企业代码
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2009-04-10 jack.jia 1. Created this procedure.
******************************************************************************/
/*TRADECODE nvarchar2(10); */
row_count integer;
row_count1 integer;
row_count2 integer;
/*cursor cur_stock_trade_code is
select trade_code from Sys_Ent where status='E02';
CurRow0 cur_stock_trade_code%rowtype;*/
--row_count123 integer;
cursor cur_stock is
select distinct COP_G_NO,
biz_type,
IE_FLAG,
c.hs_code as HSCODE,
c.G_NAME,
sum(a.qty) as qty,
(select name
from base_dir
where code = biz_type
and type = 'Biz_Type') as BIZ_TYPE_NAME,
(select name
from base_dir
where code = IE_FLAG
and type = 'IE_Mark') as IE_FLAG_NAME,
b.trade_code as trade_code
from gj_lineone_list a
inner join sys_merger_relation c on c.part_no = a.cop_g_no
and c.trade_code = TRADECODE
inner join gj_lineone_head b on a.gatejob_no = b.gatejob_no
where
--b.passdate<sysdate and
TO_DATE(TO_CHAR(b.passdate, 'YYYY-MM-DD'), 'YYYY-MM-DD') <
TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')
and b.trade_code = TRADECODE
and ((IE_FLAG = '1' and status = 'C06') or
(IE_FLAG = '2' and
(biz_type = 'B' or biz_type = 'C' or biz_type = 'D') and
status in ('K01', 'K02')) or (IE_FLAG = '2' and biz_type = 'A' and
status in ('C07', 'C06', 'K01', 'K02')) or
(IE_FLAG is null and status = 'C06'))
group by biz_type,
IE_FLAG,
COP_G_NO,
c.hs_code,
c.g_name,
b.trade_code;
CurRow cur_stock%rowtype;
/* FROM 2007-9-4 lily */
--中心内互转 (出)转出(发货)单位
cursor cur_stock1 is
select distinct a.cop_out_no,
biz_type,
--IE_FLAG,
c.hs_code as HSCODE,
c.G_NAME,
sum(a.qty) as qty,
(select name
from base_dir
where code = biz_type
and type = 'Biz_Type') as BIZ_TYPE_NAME,
--(select name from base_dir where code = IE_FLAG and type='IE_Mark') as IE_FLAG_NAME
'' as IE_FLAG_NAME,
b.ownername
from gj_center_list a
inner join gj_center_head b on a.gatejob_no = b.gatejob_no
inner join sys_merger_relation c on c.part_no = a.cop_out_no
and c.trade_code = b.ownername
where
--b.passdate<sysdate and
TO_DATE(TO_CHAR(b.passdate, 'YYYY-MM-DD'), 'YYYY-MM-DD') <
TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')
and b.ownername = TRADECODE
and b.status = 'C06'
group by a.cop_out_no,
biz_type,
--IE_FLAG,
c.hs_code,
c.g_name,
b.ownername;
CurRow1 cur_stock1%rowtype;
--中心内互转 (进)转入(申请)单位
cursor cur_stock3 is
select distinct a.cop_in_no,
biz_type,
--IE_FLAG,
c.hs_code as HSCODE,
c.G_NAME,
sum(a.qty) as qty,
(select name
from base_dir
where code = biz_type
and type = 'Biz_Type') as BIZ_TYPE_NAME,
--(select name from base_dir where code = IE_FLAG and type='IE_Mark') as IE_FLAG_NAME
'' as IE_FLAG_NAME,
b.trade_code
from gj_center_list a
inner join gj_center_head b on a.gatejob_no = b.gatejob_no
inner join sys_merger_relation c on c.part_no = a.cop_in_no
and c.trade_code = b.trade_code
where
--b.passdate<sysdate and
TO_DATE(TO_CHAR(b.passdate, 'YYYY-MM-DD'), 'YYYY-MM-DD') <
TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')
and b.trade_code = TRADECODE
and b.status = 'C06'
group by a.cop_in_no,
biz_type,
--IE_FLAG,
c.hs_code,
c.g_name,
b.trade_code;
CurRow3 cur_stock3%rowtype;
/* TO 2007-9-4 lily */
-- -- 简单加工
cursor cur_stock2 is
select distinct COP_G_NO,
c.hs_code as HSCODE,
c.G_NAME,
sum(a.num) as qty,
a.io_mark,
b.trade_code
from simpro_info a
inner join sys_merger_relation c on c.part_no = a.cop_g_no
and c.trade_code = TRADECODE
inner join simpro_head b on a.gatejob_no = b.gatejob_no
where
--b.pass_date<sysdate and
TO_DATE(TO_CHAR(b.pass_date, 'YYYY-MM-DD'), 'YYYY-MM-DD') <
TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD')
and b.status = 'C06' and b.trade_code=TRADECODE
group by COP_G_NO, c.hs_code, c.G_NAME, a.io_mark, b.trade_code;
CurRow2 cur_stock2%rowtype;
begin
/*open cur_stock_trade_code;
loop
fetch cur_stock_trade_code into CurRow0;
exit when cur_stock_trade_code%notfound;
select trade_code into TRADECODE from Sys_Ent where status='E02';
end loop;
close cur_stock_trade_code;*/
row_count := 0;
--delete from TEMP_STOCK where UserID=User_ID;
--commit;
open Cur_Stock;
loop
fetch Cur_Stock
into CurRow;
exit when Cur_Stock%notfound;
--判断有没有重复的料号 增加trade_code判断
select count(*)
into row_count
from TEMP_STOCK
where COP_G_NO = CurRow.COP_G_NO
and userid = CurRow.trade_code;
--一线进区业务
if CurRow.biz_type = 'A' and CurRow.IE_FLAG = '1' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, ONELINE_IN_COUNT, HSCODE, G_NAME, userid)
values
(CurRow.COP_G_NO,
CurRow.qty,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.trade_code);
end if;
if row_count = 1 then
update temp_stock
set ONELINE_IN_COUNT = CurRow.qty
where COP_G_NO = CurRow.COP_G_NO
and userid = CurRow.trade_code;
end if;
end if;
--一线出区业务
if CurRow.biz_type = 'A' and CurRow.IE_FLAG = '2' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, ONELINE_OUT_COUNT, HSCODE, G_NAME, userid)
values
(CurRow.COP_G_NO,
CurRow.qty,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.trade_code);
end if;
if row_count = 1 then
update temp_stock
set ONELINE_OUT_COUNT = CurRow.qty
where COP_G_NO = CurRow.COP_G_NO
and userid = CurRow.trade_code;
end if;
end if;
--二线进区业务
if CurRow.biz_type = 'B' and CurRow.IE_FLAG = '1' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, TWOLINE_IN_COUNT, HSCODE, G_NAME, userid)
values
(CurRow.COP_G_NO,
CurRow.qty,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.trade_code);
end if;
if row_count = 1 then
update temp_stock
set TWOLINE_IN_COUNT = CurRow.qty
where COP_G_NO = CurRow.COP_G_NO
and userid = CurRow.trade_code;
end if;
end if;
--二线出区
if CurRow.biz_type = 'B' and CurRow.IE_FLAG = '2' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, TWOLINE_OUT_COUNT, HSCODE, G_NAME, userid)
values
(CurRow.COP_G_NO,
CurRow.qty,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.trade_code);
end if;
if row_count = 1 then
update temp_stock
set TWOLINE_OUT_COUNT = CurRow.qty
where COP_G_NO = CurRow.COP_G_NO
and userid = CurRow.trade_code;
end if;
end if;
--特殊监管进区业务
if CurRow.biz_type = 'C' and CurRow.IE_FLAG = '1' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, SPEC_IN_COUNT, HSCODE, G_NAME, userid)
values
(CurRow.COP_G_NO,
CurRow.qty,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.trade_code);
end if;
if row_count = 1 then
update temp_stock
set SPEC_IN_COUNT = CurRow.qty
where COP_G_NO = CurRow.COP_G_NO
and userid = CurRow.trade_code;
end if;
end if;
--特殊监管出区业务
if CurRow.biz_type = 'C' and CurRow.IE_FLAG = '2' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, SPEC_OUT_COUNT, HSCODE, G_NAME, userid)
values
(CurRow.COP_G_NO,
CurRow.qty,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.trade_code);
end if;
if row_count = 1 then
update temp_stock
set SPEC_OUT_COUNT = CurRow.qty
where COP_G_NO = CurRow.COP_G_NO
and userid = CurRow.trade_code;
end if;
end if;
--分送集报进区业务
if CurRow.biz_type = 'D' and CurRow.IE_FLAG = '1' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, HSCODE, G_NAME, COLL_IN_COUNT, userid)
values
(CurRow.COP_G_NO,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.qty,
CurRow.trade_code);
end if;
if row_count = 1 then
update temp_stock
set COLL_IN_COUNT = CurRow.qty
where COP_G_NO = CurRow.COP_G_NO
and userid = CurRow.trade_code;
end if;
end if;
--分送集报出区业务
if CurRow.biz_type = 'D' and CurRow.IE_FLAG = '2' then
if row_count = 0 then
insert into TEMP_STOCK
(COP_G_NO, HSCODE, G_NAME, COLL_OUT_COUNT, userid)
values
(CurRow.COP_G_NO,
CurRow.HSCODE,
CurRow.G_NAME,
CurRow.qty,
CurRow.trade_code);
end if;
if row_count = 1 then
update temp_stock
set COLL_OUT_COUNT = CurRow.qty
where COP_G_NO = CurRow.COP_G_NO
and userid = CurRow.trade_code;
end if;
end if;
commit;
end loop;
close Cur_Stock;
/* 2007-09-04 begin lily */
--中心内互转 (出)发货单位
open Cur_Stock1;
loop
fetch Cur_Stock1
into CurRow1;
exit when Cur_Stock1%notfound;
--判断有没有重复的料号
select count(*)
into row_count1
from TEMP_STOCK
where COP_G_NO = CurRow1.Cop_Out_No
and userid = CurRow1.Ownername;
/* if (CurRow1.Cop_Out_No='TCM090330B') then
row_count123:=0;
end if;*/
--中心内互转 (出)发货单位
--if CurRow1.biz_type='E' then
if row_count1 = 0 then
insert into TEMP_STOCK
(COP_G_NO, HSCODE, G_NAME, inc_out, userid)
values
(CurRow1.Cop_Out_No,
CurRow1.HSCODE,
CurRow1.G_NAME,
CurRow1.qty,
CurRow1.Ownername);
end if;
if row_count1 = 1 then
update temp_stock
set inc_out = CurRow1.qty
where COP_G_NO = CurRow1.Cop_Out_No
and userid = CurRow1.Ownername;
end if;
-- end if;
commit;
end loop;
close Cur_Stock1;
--中心内互转 (入)申请单位
open Cur_Stock3;
loop
fetch Cur_Stock3
into CurRow3;
exit when Cur_Stock3%notfound;
--判断有没有重复的料号
select count(*)
into row_count1
from TEMP_STOCK
where COP_G_NO = CurRow3.Cop_In_No
and userid = CurRow3.Trade_Code;
--if CurRow1.biz_type='E' then
if row_count1 = 0 then
insert into TEMP_STOCK
(COP_G_NO, HSCODE, G_NAME, inc_in, userid)
values
(CurRow3.Cop_In_No,
CurRow3.HSCODE,
CurRow3.G_NAME,
CurRow3.qty,
CurRow3.Trade_Code);
end if;
if row_count1 = 1 then
update temp_stock
set inc_in = CurRow3.qty
where COP_G_NO = CurRow3.Cop_In_No
and userid = CurRow3.Trade_Code;
end if;
-- end if;
commit;
end loop;
close Cur_Stock3;
/* 2007-09-04 end lily */
-----简单加工库存查询
open Cur_Stock2;
loop
fetch Cur_Stock2
into CurRow2;
exit when Cur_Stock2%notfound;
--判断有没有重复的料号
select count(*)
into row_count2
from TEMP_STOCK
where COP_G_NO = CurRow2.COP_G_NO
and userid = CurRow2.Trade_Code;
if CurRow2.io_mark = '1' then
if row_count2 = 0 then
insert into TEMP_STOCK
(COP_G_NO, HSCODE, G_NAME, Sip_in, userid)
values
(CurRow2.COP_G_NO,
CurRow2.HSCODE,
CurRow2.G_NAME,
CurRow2.qty,
CurRow2.Trade_Code);
end if;
if row_count2 = 1 then
update temp_stock
set Sip_in = CurRow2.qty
where COP_G_NO = CurRow2.COP_G_NO
and userid = CurRow2.Trade_Code;
end if;
end if;
if CurRow2.io_mark = '2' then
if row_count2 = 0 then
insert into TEMP_STOCK
(COP_G_NO, HSCODE, G_NAME, Sip_out, userid)
values
(CurRow2.COP_G_NO,
CurRow2.HSCODE,
CurRow2.G_NAME,
CurRow2.qty,
CurRow2.Trade_Code);
end if;
if row_count2 = 1 then
update temp_stock
set Sip_out = CurRow2.qty
where COP_G_NO = CurRow2.COP_G_NO
and userid = CurRow2.Trade_Code;
end if;
end if;
commit;
end loop;
close Cur_Stock2;
Exception
when others then
rollback;
end PRO_TJ_STOCK_Before;
---------------------------------------------------------------------------------------------------------------------------------
PRO_TJ_STOCK_Before这个存储过程与PRO_TJ_STOCK类似,只是由单用户统计转为了多用户统计,并且把用户名称保存到TEMP_STOCK.userid字段里面了
然后来看今天当天的库存统计
---------------------------------------------------------------------------------------------------------------------------------
create or replace procedure PRO_TJ_STOCK_today(TRADECODE in varchar2, User_ID in varchar2) is
/******************************************************************************
PURPOSE: 每天跑作业 统计今天的料号库存明细
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2009-04-10 jack.jia 1. Created this procedure.
******************************************************************************/
row_count integer;
row_count1 integer;
row_count2 integer;
cursor cur_stock is
select distinct COP_G_NO,biz_type,IE_FLAG,c.hs_code as HSCODE,c.G_NAME,
sum(a.qty) as qty,
(select name from base_dir where code = biz_type and type = 'Biz_Type') as BIZ_TYPE_NAME,
(select name from base_dir where code = IE_FLAG and type='IE_Mark') as IE_FLAG_NAME
from gj_lineone_list a
inner join sys_merger_relation c
on c.part_no = a.cop_g_no and c.trade_code = TRADECODE
inner join gj_lineone_head b
on a.gatejob_no = b.gatejob_no
where -- b.passdate=sysdate and
TO_DATE(TO_CHAR(b.passdate,'YYYY-MM-DD'),'YYYY-MM-DD')=TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD') and
trade_code = TRADECODE and (( IE_FLAG ='1' and status ='C06')
or (IE_FLAG ='2' and (biz_type = 'B' or biz_type = 'C' or biz_type = 'D')
and status in('K01','K02')) or (IE_FLAG ='2' and biz_type = 'A' and
status in('C07','C06','K01','K02')) or (IE_FLAG is null and status ='C06'))
group by biz_type, IE_FLAG, COP_G_NO,c.hs_code,c.g_name;
CurRow cur_stock%rowtype;
/* FROM 2007-9-4 lily */
--中心内互转 (出)转出(发货)单位
cursor cur_stock1 is
select distinct a.cop_out_no,biz_type,
--IE_FLAG,
c.hs_code as HSCODE,c.G_NAME,
sum(a.qty) as qty,
(select name from base_dir where code = biz_type and type = 'Biz_Type') as BIZ_TYPE_NAME,
--(select name from base_dir where code = IE_FLAG and type='IE_Mark') as IE_FLAG_NAME
'' as IE_FLAG_NAME
from gj_center_list a
inner join gj_center_head b
on a.gatejob_no = b.gatejob_no
inner join sys_merger_relation c
on c.part_no = a.cop_out_no and c.trade_code = b.ownername
where --b.passdate=sysdate and
TO_DATE(TO_CHAR(b.passdate,'YYYY-MM-DD'),'YYYY-MM-DD')=TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD') and
b.ownername = TRADECODE and b.status ='C06'
group by a.cop_out_no,biz_type,
--IE_FLAG,
c.hs_code,c.g_name;
CurRow1 cur_stock1%rowtype;
--中心内互转 (进)转入(申请)单位
cursor cur_stock3 is
select distinct a.cop_in_no,biz_type,
--IE_FLAG,
c.hs_code as HSCODE,c.G_NAME,
sum(a.qty) as qty,
(select name from base_dir where code = biz_type and type = 'Biz_Type') as BIZ_TYPE_NAME,
--(select name from base_dir where code = IE_FLAG and type='IE_Mark') as IE_FLAG_NAME
'' as IE_FLAG_NAME
from gj_center_list a
inner join gj_center_head b
on a.gatejob_no = b.gatejob_no
inner join sys_merger_relation c
on c.part_no = a.cop_in_no and c.trade_code = b.trade_code
where --b.passdate=sysdate and
TO_DATE(TO_CHAR(b.passdate,'YYYY-MM-DD'),'YYYY-MM-DD')=TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD') and
b.trade_code = TRADECODE and b.status ='C06'
group by a.cop_in_no,biz_type,
--IE_FLAG,
c.hs_code,c.g_name;
CurRow3 cur_stock3%rowtype;
/* TO 2007-9-4 lily */
-- -- 简单加工
cursor cur_stock2 is
select distinct COP_G_NO,
c.hs_code as HSCODE,c.G_NAME,
sum(a.num) as qty,a.io_mark
from simpro_info a
inner join sys_merger_relation c
on c.part_no = a.cop_g_no and c.trade_code = TRADECODE
inner join simpro_head b
on a.gatejob_no = b.gatejob_no
where --b.pass_date=sysdate
TO_DATE(TO_CHAR(b.pass_date,'YYYY-MM-DD'),'YYYY-MM-DD')=TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD') and
status ='C06'
group by COP_G_NO, c.hs_code,c.G_NAME,a.io_mark;
CurRow2 cur_stock2%rowtype;
begin
row_count:=0;
EXECUTE IMMEDIATE 'truncate table TEMP1_STOCK_1_1';
EXECUTE IMMEDIATE 'truncate table temp1_stock_1_1_1';
--delete from TEMP1_STOCK_1_1 where UserID=User_ID;
--commit;
open Cur_Stock;
loop
fetch Cur_Stock into CurRow;
exit when Cur_Stock%notfound;
--判断有没有重复的料号
select count(*) into row_count from TEMP1_STOCK_1_1 where UserID=User_ID and COP_G_NO =CurRow.COP_G_NO ;
--一线进区业务
if CurRow.biz_type='A' and CurRow.IE_FLAG ='1' then
if row_count =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO,ONELINE_IN_COUNT,USERID,HSCODE,G_NAME) values(CurRow.COP_G_NO ,CurRow.qty,User_ID,CurRow.HSCODE ,CurRow.G_NAME);
end if;
if row_count =1 then
update TEMP1_STOCK_1_1 set ONELINE_IN_COUNT = CurRow.qty where USERID=User_ID and COP_G_NO =CurRow.COP_G_NO;
end if;
end if;
--一线出区业务
if CurRow.biz_type='A' and CurRow.IE_FLAG ='2' then
if row_count =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO,ONELINE_OUT_COUNT,Userid,HSCODE,G_NAME) values(CurRow.COP_G_NO, CurRow.qty,User_ID,CurRow.HSCODE ,CurRow.G_NAME);
end if;
if row_count =1 then
update TEMP1_STOCK_1_1 set ONELINE_OUT_COUNT = CurRow.qty where USERID=User_ID and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--二线进区业务
if CurRow.biz_type='B' and CurRow.IE_FLAG ='1' then
if row_count =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO,TWOLINE_IN_COUNT, Userid, HSCODE,G_NAME) values(CurRow.COP_G_NO, CurRow.qty, User_ID,CurRow.HSCODE ,CurRow.G_NAME);
commit;
end if;
if row_count =1 then
update TEMP1_STOCK_1_1 set TWOLINE_IN_COUNT = CurRow.qty where USERID=User_ID and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--二线出区
if CurRow.biz_type='B' and CurRow.IE_FLAG ='2' then
if row_count =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO, TWOLINE_OUT_COUNT, Userid ,HSCODE,G_NAME) values(CurRow.COP_G_NO, CurRow.qty,User_ID,CurRow.HSCODE ,CurRow.G_NAME);
end if;
if row_count =1 then
update TEMP1_STOCK_1_1 set TWOLINE_OUT_COUNT = CurRow.qty where USERID=User_ID and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--特殊监管进区业务
if CurRow.biz_type='C' and CurRow.IE_FLAG ='1' then
if row_count =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO, SPEC_IN_COUNT, Userid ,HSCODE,G_NAME) values(CurRow.COP_G_NO, CurRow.qty,User_ID,CurRow.HSCODE ,CurRow.G_NAME);
end if;
if row_count =1 then
update TEMP1_STOCK_1_1 set SPEC_IN_COUNT = CurRow.qty where USERID=User_ID and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--特殊监管出区业务
if CurRow.biz_type='C' and CurRow.IE_FLAG ='2' then
if row_count =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO, SPEC_OUT_COUNT, Userid,HSCODE,G_NAME ) values(CurRow.COP_G_NO, CurRow.qty, User_ID,CurRow.HSCODE ,CurRow.G_NAME);
end if;
if row_count =1 then
update TEMP1_STOCK_1_1 set SPEC_OUT_COUNT = CurRow.qty where USERID=User_ID and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--分送集报进区业务
if CurRow.biz_type='D' and CurRow.IE_FLAG ='1' then
if row_count =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO,Userid,HSCODE,G_NAME,COLL_IN_COUNT) values(CurRow.COP_G_NO, User_ID,CurRow.HSCODE ,CurRow.G_NAME,CurRow.qty);
end if;
if row_count =1 then
update TEMP1_STOCK_1_1 set COLL_IN_COUNT = CurRow.qty where USERID=User_ID and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
--分送集报出区业务
if CurRow.biz_type='D' and CurRow.IE_FLAG ='2' then
if row_count =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO,Userid,HSCODE,G_NAME,COLL_OUT_COUNT) values(CurRow.COP_G_NO,User_ID,CurRow.HSCODE ,CurRow.G_NAME,CurRow.qty);
end if;
if row_count =1 then
update TEMP1_STOCK_1_1 set COLL_OUT_COUNT = CurRow.qty where USERID=User_ID and COP_G_NO = CurRow.COP_G_NO;
end if;
end if;
commit;
end loop;
close Cur_Stock;
/* 2007-09-04 begin lily */
--中心内互转 (出)发货单位
open Cur_Stock1;
loop
fetch Cur_Stock1 into CurRow1;
exit when Cur_Stock1%notfound;
--判断有没有重复的料号
select count(*) into row_count1 from TEMP1_STOCK_1_1 where UserID=User_ID and COP_G_NO =CurRow1.Cop_Out_No ;
--中心内互转 (出)发货单位
--if CurRow1.biz_type='E' then
if row_count1 =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO,Userid,HSCODE,G_NAME,inc_out) values(CurRow1.Cop_Out_No,User_ID,CurRow1.HSCODE ,CurRow1.G_NAME,CurRow1.qty);
end if;
if row_count1 =1 then
update TEMP1_STOCK_1_1 set inc_out = CurRow1.qty where USERID=User_ID and COP_G_NO = CurRow1.Cop_Out_No;
end if;
-- end if;
commit;
end loop;
close Cur_Stock1;
--中心内互转 (入)申请单位
open Cur_Stock3;
loop
fetch Cur_Stock3 into CurRow3;
exit when Cur_Stock3%notfound;
--判断有没有重复的料号
select count(*) into row_count1 from TEMP1_STOCK_1_1 where UserID=User_ID and COP_G_NO =CurRow3.Cop_In_No ;
--if CurRow1.biz_type='E' then
if row_count1 =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO,Userid,HSCODE,G_NAME,inc_in) values(CurRow3.Cop_In_No,User_ID,CurRow3.HSCODE ,CurRow3.G_NAME,CurRow3.qty);
end if;
if row_count1 =1 then
update TEMP1_STOCK_1_1 set inc_in = CurRow3.qty where USERID=User_ID and COP_G_NO = CurRow3.Cop_In_No;
end if;
-- end if;
commit;
end loop;
close Cur_Stock3;
/* 2007-09-04 end lily */
-----简单加工库存查询
open Cur_Stock2;
loop
fetch Cur_Stock2 into CurRow2;
exit when Cur_Stock2%notfound;
--判断有没有重复的料号
select count(*) into row_count2 from TEMP1_STOCK_1_1 where UserID=User_ID and COP_G_NO =CurRow2.COP_G_NO ;
if CurRow2.io_mark='1' then
if row_count2 =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO,Userid,HSCODE,G_NAME,Sip_in) values(CurRow2.COP_G_NO,User_ID,CurRow2.HSCODE ,CurRow2.G_NAME,CurRow2.qty);
end if;
if row_count2 =1 then
update TEMP1_STOCK_1_1 set Sip_in = CurRow2.qty where USERID=User_ID and COP_G_NO = CurRow2.COP_G_NO;
end if;
end if;
if CurRow2.io_mark='2' then
if row_count2 =0 then
insert into TEMP1_STOCK_1_1 (COP_G_NO,Userid,HSCODE,G_NAME,Sip_out) values(CurRow2.COP_G_NO,User_ID,CurRow2.HSCODE ,CurRow2.G_NAME,CurRow2.qty);
end if;
if row_count2 =1 then
update TEMP1_STOCK_1_1 set Sip_out = CurRow2.qty where USERID=User_ID and COP_G_NO = CurRow2.COP_G_NO;
end if;
end if;
commit;
end loop;
close Cur_Stock2;
insert into temp1_stock_1_1_1(
cop_g_no,oneline_in_count,oneline_out_count,
twoline_in_count,twoline_out_count,
spec_in_count,spec_out_count,
coll_in_count,coll_out_count,
inc_in,inc_out,
sip_in,sip_out,
hscode,g_name
)
/* select a.*
FROM temp_stock a
left outer join sys_curr_rate r ON r.t_currcode = '502'
left join gj_stock b on a.cop_g_no = b.cop_g_no
WHERE --userid = 'cblc' and
b.TRADE_CODE = TRADECODE;*/
select a.cop_g_no,
sum(a.oneline_in_count) as oneline_in_count,
sum(a.oneline_out_count) as oneline_out_count,
sum(a.twoline_in_count) as twoline_in_count,
sum(a.twoline_out_count) as twoline_out_count,
sum(a.spec_in_count) as spec_in_count,
sum(a.spec_out_count) as spec_out_count,
sum(a.coll_in_count) as coll_in_count,
sum(a.coll_out_count) as coll_out_count,
sum(a.inc_in) as inc_in,
sum(a.inc_out) as inc_out,
sum(a.sip_in) as sip_in,
sum(a.sip_out) as sip_out,
a.hscode,
a.g_name
FROM temp_stock a
left outer join sys_curr_rate r ON r.t_currcode = '502'
left join gj_stock b on a.cop_g_no = b.cop_g_no
WHERE
--a.userid is NULL and
(a.userid = TRADECODE or a.userid is NULL ) and
b.TRADE_CODE = TRADECODE and a.cop_g_no=b.cop_g_no
group by a.cop_g_no, a.hscode,a.g_name;
update temp1_stock_1_1_1 set USERID = User_ID;
commit;
Exception
when others then rollback;
end PRO_TJ_STOCK_today;
---------------------------------------------------------------------------------------------------------------------------------
PRO_TJ_STOCK_today 存储过程把今天的统计数据保存到了 TEMP1_STOCK_1_1 和 temp1_stock_1_1_1 里面
保存当天的料号库存(没有经过筛选的) 和 保存当天的料号库存(经过筛选的)
temp1_stock_1_1_1 保存的的是 temp_stock里面当前用户的今天之前的数据
---------------------------------------------------------------------------------------------------------------------------------
通过视图与temp_stock 联合查询把数据显示出来
create or replace view v_temp1_stock as
select a.cop_g_no,
sum(a.oneline_in_count) as oneline_in_count,
sum(a.oneline_out_count) as oneline_out_count,
sum(a.twoline_in_count) as twoline_in_count,
sum(a.twoline_out_count) as twoline_out_count,
sum(a.spec_in_count) as spec_in_count,
sum(a.spec_out_count) as spec_out_count,
a.userid,
a.hscode,
a.g_name,
sum(a.coll_in_count) as coll_in_count,
sum(a.coll_out_count) as coll_out_count,
sum(a.inc_in) as inc_in,
sum(a.inc_out) as inc_out,
sum(a.sip_in) as sip_in,
sum(a.sip_out) as sip_out
from
(
select * from temp1_stock_1_1_1
/* where cop_g_no='DSD081127-3'*/
union
select * from temp1_stock_1_1
/* where cop_g_no='DSD081127-3'*/
) a
/*where a.cop_g_no='DSD081127-3'
and a.userid='cblc'*/
group by a.cop_g_no, a.userid, a.hscode,a.g_name
---------------------------------------------------------------------------------------------------------------------------------
每天凌晨1点跑Job,把前一天的以前的所有库存数据跑出来保存到 TEMP_STOCK表里面
begin
sys.dbms_job.submit(job => :job,
what => 'begin
pro_tj_stock_forjob();
end;',
next_date => to_date('09-04-2022 23:30:30', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'TRUNC(sysdate) + 1 +1 / (24)');
commit;
end;
/
---------------------------------------------------------------------------------------------------------------------------------
每天需要查看报表的时候只需要运行 PRO_TJ_STOCK_today存储过程,显示 v_temp1_stock 就可以了