隨筆-61  評論-13  文章-19  trackbacks-0

          日志報表查詢

          最近在做一個流水表的報表查詢,做下小結(jié)。

          一般情況下對于數(shù)據(jù)量比較大的流水日志,都是按月隔接存儲的,所以在生成跨月甚至是跨年報表的時候,需要做特殊的處理。以下記錄我的處理方式,供參考。

          思路:

          1、  生成臨時表:查詢出的數(shù)據(jù)都放在該臨時表。

          2、  按月查詢:將查詢條件中的開始時間到結(jié)束時間之間的數(shù)據(jù)按月依次查詢。

          3、  查詢:(Oracle數(shù)據(jù)庫)

          參數(shù)定義:Start_Date 開始時間

                    End_Date 結(jié)束時間

                    Tmp_Date 當(dāng)前時間

                    Tmp_Data 臨時數(shù)據(jù)表

                    Month_TBName 月表名


          Tmp_Date = Start_Date


          While Tmp_Date < End_Date Loop


              
          Month_TBName =  tuunc(Tmp_Date,’month’)


              Tmp_Date = Add_Months(Tmp_Data,1)    注:
          下次查詢?yōu)橄略卤頂?shù)據(jù)


               If  Tmp_Date > End_Date


             
                  
          查詢Month_TBName月表中日期Between Start_Date And End_Date的數(shù)據(jù),放入Tmp_Data 
                   

          Else


              
                  
          查詢Month_TBName全月表數(shù)據(jù),放入Tmp_Data


           End Loop

            3、 存儲過程
              --SP統(tǒng)計(jì)
              procedure xp_SPStat(areacode    varchar2,
                                  songId      varchar2,
                                  dateStart   varchar2,
                                  dateEnd     varchar2,
                                  spID        varchar2,
                                  page        number, --之前顯示的頁碼
                                  pageSize    number, --頁大小
                                  pageAction  varchar2, --翻頁命令:first、last、next、pre
                                  total       out number, --記錄總數(shù)
                                  currentPage out number, --當(dāng)前頁碼
                                  totalPage   out number, --總頁數(shù)
                                  ret         out number, --操作結(jié)果
                                  rec_rc      out ret_record --結(jié)果集
                                  ) is
                  tablename varchar2(100);
                  sqlstr    varchar2(256) := '';
                  num_start number; --個數(shù)下限
                  num_end   number; --個數(shù)上限
                  sqlstry  varchar2(256) := '';
              begin
                  if isStatOverSpaned(dateStart, dateEnd) then
                      --時間范圍過大
                      ret := ret_err_overspan;
                      return;
                  end if;
                  if statTempTable(areacode,songId,spID,dateStart, dateEnd, tablename) = false then
                      ret := ret_err_tmptable;
                      return;
                  end if;
                  --獲取總數(shù)
                  select count(*)
                    into total
                    from (select t.song_id, count(*) as statCount
                            from tsongdeallogtemp t
                          
                           group by t.song_id);
                  --翻頁處理
                  pageTurn(page, pageSize, total, pageAction, currentPage, totalPage);
                  num_start := (currentPage - 1) * pagesize + 1;
                  num_end   := currentPage * pagesize;

                  --獲取數(shù)據(jù)集
                  open rec_rc for
                      select *
                        from (select c. *, rownum rn
                                from (select a.statcount,
                                     (select count(a.statcount) from (select  count(*) as statcount
                                                from tsongdeallogtemp t)
                                     ) FSTATCOUNT, b. *
                                        from (select t.song_id, count(*) as statcount
                                                from tsongdeallogtemp t
                                              
                                               group by t.song_id) a,
                                             tSong b
                                       where a.song_id = b.song_id
                                       order by a.statcount desc) c)
                       where rn between num_start and num_end;
                  ret := ret_ok;

              exception
                  when others then
                      sqlstry :=sqlerrm;
                      ret := ret_Failed;
              end;

             --sp統(tǒng)計(jì)臨時表操作
             function statTempTable(vareacode  varchar2,
                                     vsongId    varchar2,
                                     vspID      varchar2,
                                     vdateStart varchar2,
                                     vdateEnd   varchar2,
                                     pTabName  out varchar2) return boolean is
                  ret       boolean := false;
                  tmp_date  date := to_date(vdateStart, 'YYYY-MM-DD');
                  v_dateS   date := to_date(vdateStart, 'YYYY-MM-DD');
                  v_dateE   date := to_date(vdateEnd, 'YYYY-MM-DD');
                  tmpCount  number := 0;
                  iCount    number := 0;
                  tablename varchar2(100);
                  sqlstr    varchar2(516);
                  tempSql   varchar2(100);
              begin
                  --獲取臨時表名
                  tablename := getSongDealTabName(1);
                  pTabName  := tablename;
                  sqlstr    := 'delete from ' || tablename;
                  execute immediate sqlstr;
              
                  --往臨時表中寫入數(shù)據(jù)
                  while tmp_date <= to_date(vdateEnd ||'23:59:59', 'YYYY-MM-DD HH24:MI:SS') loop
                      tablename := 'TSONGDEALLOG' ||
                                   to_char(trunc(tmp_date, 'month'), 'YYYYMM');
                      select count(*)
                        into iCount
                        from tab t
                       where t.tname = tablename;
                      if iCount <= 0 then
                          return ret;
                      end if;
                      tmp_date := add_months(tmp_date, 1);
                      tmpCount := tmpCount + 1;
                     
                      if vsongId is not null then
                        tempSql:=' t.song_id='''||vsongId||''' ';
                      else
                        tempSql:=' t.song_id like '''||vspID||'%'' ';
                      end if; 
                     
                     
                      if tmp_date >= to_date(vdateEnd||'23:59:59', 'YYYY-MM-DD HH24:MI:SS') then

                          sqlstr := 'insert into tsongdeallogtemp ( select * from ' ||
                                    tablename || ' t where '|| tempSql ||
                                    ' and t.PHONE_CODE like '''||vareacode||'%'''||
                                    ' and t.add_time   between '||
                                    'to_date('''||vdateStart|| ' 00:00:00'',''yyyy-mm-dd HH24:MI:SS'')  and ' ||
                                    'to_date('''||vdateEnd|| ' 23:59:59'',''yyyy-mm-dd HH24:MI:SS''))';
                          execute immediate sqlstr  ;
                      else
                          sqlstr := 'insert into tsongdeallogtemp select * from ' ||
                                    tablename || ' t where '|| tempSql ||
                                    ' and t.PHONE_CODE like '''||vareacode||'%''';
                          execute immediate sqlstr  ;
                      end if;

                  end loop;
                  commit;
                  return true;
              exception
                  when others then
                  sqlstr:=sqlerrm;
                      return false;
                      rollback;
              end;

          posted on 2006-03-14 16:10 xnabx 閱讀(484) 評論(0)  編輯  收藏 所屬分類: 3、DataBase

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 丰镇市| 黄山市| 巴楚县| 公安县| 永川市| 华容县| 呈贡县| 勃利县| 聊城市| 巧家县| 阿坝| 威宁| 探索| 合水县| 皮山县| 灵武市| 达州市| 滨州市| 临漳县| 新宾| 惠来县| 阜宁县| 正定县| 邻水| 本溪市| 翁源县| 招远市| 贵德县| 平潭县| 阿勒泰市| 大渡口区| 孝义市| 自贡市| 淮南市| 莒南县| 崇州市| 环江| 嘉义市| 海淀区| 曲沃县| 牡丹江市|