能源数采的日报月报是能源数采系统的一个后继系统,在数采系统在既定的固定或随机的时钟下,把自动化的一些智能仪表的值,像水电煤气的用量值,存入到Label 表中,这是一个很庞大的运算,用C实现的话,得用多个TIMER, 每个TIMER定时进行同间隔频率数据的读写,还得把时钟均匀分布,让同等吞吐量的数据库存取更多的数值。这些数据可应用于过程控制,也可用于大数据分析。其中日报月报就是用于ERP成本。
下面是日报月报系统的几个模块。
- 日报的初始化模块
CREATE OR REPLACE PROCEDURE DW.label1_csh(date1 in date,date2 in date,lock1 in varchar2) IS
/*date1是当天值,DATE2是昨天的日期,lock1是个标识,‘1’时可删除数据重算。
tmpVar NUMBER;
cnt1 number;
sql1 varchar(1000);
v0 number(30,6);
/*游标存一下日报当天的数据。
cursor cur1
is
select date_day,label_bm,label_id
from label1_day_report
where date_day = date1;
c_row cur1%rowtype;
BEGIN
if lock1='1' then
delete from label1_day_report where date_day=date1;
end if;
tmpVar := 0;
/* label1_area 是所有标签的编码库,其中 day_report_flag='1' 是计入日报的。
select count(*) into cnt1 from label1_day_report where date_day=date1;
if cnt1=0 then
insert into label1_day_report(label_id,label_bm,date_day,parent_id,count_bz) select label_id,label_bm,date1,parent_id,count_bz from label1_area where day_report_flag='1' ;
end if ;
--昨日末值,今日初值。
update label1_day_report a
set (a.v1_day_begin)=(select b.v1_day_end
from label1_day_report b
where to_char(a.date_DAY,'yyyy-mm-dd')=to_char(date1,'yyyy-mm-dd') and to_char(b.date_day,'yyyy-mm-dd')=to_char(date2,'yyyy-mm-dd')
and a.label_bm=b.label_bm
and a.label_id=b.label_id )
where exists (select 1
from label1_day_report b
where to_char(a.date_DAY,'yyyy-mm-dd')=to_char(date1,'yyyy-mm-dd') and to_char(b.date_day,'yyyy-mm-dd')=to_char(date2,'yyyy-mm-dd')
and a.label_bm=b.label_bm
and a.label_id=b.label_id );
----游标循环,日报值依次从LABEL1中取来。
FOR c_row in cur1 loop
select MIN(b.v1) into v0
from label1 b
where to_char(b.date_time1,'yyyy-mm-dd')=to_char(date1,'YYYY-MM-DD')
and b.label_bm=c_row.label_bm
and b.label_id=c_row.label_id;
update label1_day_report
set v1_day_end=v0
where date_DAY=date1 and label_bm=c_row.label_bm
and label_id=c_row.label_id;
end loop;
COMMIT;
---给取的基本库中的值加一个标志。
label1_jbz1(date1,'1');
commit;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
commit;
END label1_csh;
/
下面是一个递归的算父项的值。/
CREATE OR REPLACE function DW.label1_rb_count1(date1 in date,label_id1 in number) return number
is
tmpVar NUMBER;
cnt1 number;
sql1 varchar(1000);
v0 number(30,6);
v3 number(30,6);
T1 number(30,6);
month1 varchar(7);
month2 varchar(7);
str1 varchar(10);
date2 date;
cursor cur1( f01 varchar2,parent_id1 number)
is
select parent_id,label_bm,label_id,count_bz
from label1_area
where day_report_flag=f01 and parent_id=parent_id1;
c_row cur1%rowtype;
begin
select to_char(date1,'yyyy-mm-dd') into str1 from dual;
select to_char(add_months(date1, -1),'yyyy-mm') into month2 from dual;
T1:=0;
FOR c_row in cur1('1',label_id1) loop
if c_row.count_bz='1' then
select nvl(a.v1_day_end,0) - nvl(a.v1_day_begin,0) into v3 from label1_day_report a
where to_char(a.date_day,'yyyy-mm-dd')=to_CHAR(date1,'yyyy-mm-dd')
and a.label_id= c_row.label_id ;
update label1_day_report a set a.V1_read=nvl(v3,0),a.v1_cnt=nvl(v3,0)
where to_char(a.date_day,'yyyy-mm-dd')=to_CHAR(date1,'yyyy-mm-dd')
and a.label_id= c_row.label_id ;
T1:=T1+nvl(v3,0);
v3:=label1_rb_count1(date1,c_row.label_id) ;
end if ;
if c_row.count_bz='2' then
v3:=label1_rb_count1(date1,c_row.label_id) ;
update label1_day_report a
set a.V1_cnt=v3
where to_char(a.date_day,'yyyy-mm-dd')=to_CHAR(date1,'yyyy-mm-dd')
and a.label_id= c_row.label_id ;
T1:=T1+v3;
end if;
if c_row.count_bz='3' then
v3:=label1_rb_count1(date1,c_row.label_id) ;
----如果是标志3 ,又没有子项,V1_CNT=V1END-V1BEGIN.
update label1_day_report a
set a.V1_cnt=v3
where to_char(a.date_day,'yyyy-mm-dd')=to_CHAR(date1,'yyyy-mm-dd')
and a.label_id= c_row.label_id ;
end if;
end loop;
update label1_day_report a set a.v1_cnt=T1
where to_char(a.date_day,'yyyy-mm-dd')=to_CHAR(date1,'yyyy-mm-dd')
and a.label_id= label_id1 ;
return T1;
return T1;
end;
/