首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

哪位高手能帮小弟我优化下这段代码

2012-01-01 
谁能帮我优化下这段代码gc_okvarchar2(10) : okgc_pagelennumber(10): 100 --*--*--*--*--*--*--*--

谁能帮我优化下这段代码
gc_ok varchar2(10) := 'ok';
  gc_pagelen number(10) := 100 ; 

--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--

procedure paging(
  vi_ymd in date,
  vi_pagelen in out integer, -- 0: 不用分页,查询出全部记录。-1:缺省页长度
  vi_pagenum in out integer,  
  vo_msg out varchar2,
  vo_total out integer,
  vo_hasnext out integer, -- 0: have not next records; 1: hasnext is true
  vo_cursor out sys_refcursor
)is
 
  v_ymd date;
  v_pagehead number;
  v_pagetail number;
  v_pagelen number;
  v_count integer;
  
begin
  
  vo_msg := gc_ok;
  v_ymd := trunc(vi_ymd);
  
  if vi_pagelen > 0 then
  v_pagelen := vi_pagelen;
  elsif vi_pagelen < 0 then
  v_pagelen := gc_pagelen;
  end if;
  
  v_pagehead := vi_pagenum * v_pagelen + 1; --第一个记录rownum
  v_pagetail := vi_pagenum * v_pagelen + v_pagelen; --最后一个记录rownum
   
  select count(*) into v_count from 
  ( select rownum row_no, x.* from
  ( select b.orgidt, b.cusidt, b.apcode, b.curcde, b.actnam, a.bal, a.avgbal
  from t_bal a, t_act b
  where a.ymd = v_ymd
  and a.act_id = b.id
  ) x
  ) y;

  if v_count > 0 then
   
  vo_total := v_count;  
   
  case vi_pagelen 
   
  when 0 then
  open vo_cursor for 
  select row_no, y.* from
  ( select rownum row_no, x.* from
  ( select b.orgidt, b.cusidt, b.apcode, b.curcde, b.actnam, a.bal, a.avgbal
  from t_bal a, t_act b
  where a.ymd = v_ymd
  and a.act_id = b.id
  ) x
  ) y;
   
  when -1 then 
   
  open vo_cursor for 
  select row_no, y.* from
  ( select rownum row_no, x.* from
  ( select b.orgidt, b.cusidt, b.apcode, b.curcde, b.actnam, a.bal, a.avgbal
  from t_bal a, t_act b
  where a.ymd = v_ymd
  and a.act_id = b.id
  ) x
  ) y
  where row_no between v_pagehead and v_pagetail;
   
  else
   
  open vo_cursor for 
  select row_no, y.* from
  ( select rownum row_no, x.* from
  ( select b.orgidt, b.cusidt, b.apcode, b.curcde, b.actnam, a.bal, a.avgbal
  from t_bal a, t_act b
  where a.ymd = v_ymd
  and a.act_id = b.id
  ) x
  ) y
  where row_no between v_pagehead and v_pagetail;
   
  end case;
  else 
   
  open vo_cursor for 
  select null orgidt,null cusidt,null apcode,null curcde,
  null actnam,null bal,null avgbal from dual;
  return;
   
  end if;
  
  if vi_pagenum * vi_pagelen + gc_pagelen < v_count then
  vo_hasnext := 1;
  elsif vi_pagenum * vi_pagelen + gc_pagelen >= v_count then
  vo_hasnext := 0;


  end if;
   
exception
  when others then begin
  vo_msg := sqlerrm;
  end;
end;


我写的一个分页,判断条件是 
vi_pagelen = 0 则全显示记录不做分页,
  = -1 缺省长度 包体头定义过是 100(gc_pagelen number(10) := 100 ; )
  = 任意数字,既是用户自定义每页显示多少条记录

领导说太长还能优化,我刚接触不久,想了半天也不知道还怎么优化。。
求各位大虾帮下忙。

[解决办法]
建议:
1.计算total时,不要用你的方法,用:
SELECT count(1)
FROM T_BAL A, T_ACT B
 WHERE A.YMD = V_YMD
AND A.ACT_ID = B.ID获得表中的总数量。
2.禁止全表输出,即禁止“0: 不用分页,查询出全部记录”,因为如果表数量巨大时,会因此死的很惨。
3.分页的优化代码是(为了看着方便,创建view t:
CREATE OR REPLACE VIEW t AS 
SELECT B.ORGIDT, B.CUSIDT, B.APCODE, B.CURCDE, B.ACTNAM, A.BAL, A.AVGBAL
FROM T_BAL A, T_ACT B
 WHERE A.YMD = V_YMD
AND A.ACT_ID = B.ID;)

下面是分页代码(里面的变量&MAXRNM/&MINRNM可以有程序中动态指定):
SELECT *
FROM (SELECT ROWNUM RNO, t.*
FROM t
WHERE ROWNUM <= &MAXRNM)
 WHERE RNO >= &MINRNM;



引用楼主 allrun0204 的帖子:
gc_ok varchar2(10) := 'ok';
gc_pagelen number(10) := 100 ;

--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--

procedure paging(
vi_ymd in date,
vi_pagelen in out integer, -- 0: 不用分页,查询出全部记录。-1:缺省页长度
vi_pagenum in out integer,
vo_msg out varchar2,
vo_total out integer,

热点排行