oracle 高手过招,比较两种算法的不一样。

 

CREATE OR REPLACE function DW.label1_rb_count1(date1 in date,label_id1  in  number) return numbersql

isoop

tmpVar NUMBER;code

cnt1  number;io

sql1  varchar(1000);function

v0    number(30,6);date

v3    number(30,6);select

T1  number(30,6);loop

month1  varchar(7);co

month2  varchar(7);return

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;

/

 

 

CREATE OR REPLACE function DW.label1_rb_count4(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;
V1   NUMBER(30,6);
s1   number(30,6);

cursor cur1(date1 date,parent_id1 number)
       is
       select  parent_id,label_bm,label_id,count_bz,count_bz2
       from    label1_day_report
        where   date_day=date1    and parent_id =parent_id1; 
 c_row   cur1%rowtype;

  

begin

s1:=0;

 
 FOR c_row in cur1(date1,label_id1) loop
 
       T1:=label1_rb_count4(date1,c_row.label_id);
        
       select  
         sum(decode(b.count_bz,'1',(nvl(b.v1_day_end,0)-nvl(b.v1_day_begin,0)),'2',nvl(b.v1_cnt,0),'3',decode(b.count_bz2,'1',(nvl(b.v1_day_end,0)-nvl(b.v1_day_begin,0)),'2',nvl(b.v1_cnt,0))))
               into   v0
                                         from  label1_day_report b 
                                        where    
                                                 to_char(b.date_Day,'yyyy-mm-dd')=to_CHAR(date1,'yyyy-mm-dd') 
                                                 and b.parent_id= c_row.label_id 
                                                 and b.count_bz<>'3';
      
     -- update   label1_day_report  a  set a.V1_cnt = (select  sum(decode(b.count_bz, '1',nvl(b.v1_day_end,0)-  nvl(b.v1_day_begin,0),
     v0:=nvl(v0,0);
     update   label1_day_report  a  set a.V1_cnt =v0  
                                   where  to_char(a.date_Day,'yyyy-mm-dd')=to_CHAR(date1,'yyyy-mm-dd') 
                                              and a.label_id= c_row.label_id;
                                              
    s1:=s1+v0;                                      
  end loop;

            
 update   label1_day_report  a  set a.V1_cnt =nvl(a.v1_day_end,0)-nvl(a.v1_day_begin,0)  
                                  where  to_char(a.date_Day,'yyyy-mm-dd')=to_CHAR(date1,'yyyy-mm-dd') 
                                            and a.label_id= label_id1
                                            and a.count_bz='3';
       

              RETURN  s1;  end ; /