改进的Oracle分页存储过程

来源:互联网 发布:小米手机如何连mac 编辑:程序博客网 时间:2024/05/16 10:24

--Oracle分页存储过程(1)--
--定义包头部
create or replace package ZK_Pack is
type refCursorType is ref cursor;             --定义游标变量用于返回记录集
procedure PageSort_proc   
                 (p_field in varchar2,      --要查询的字段
                  p_sql in varchar2,        --表名                         
                  p_PageSize in number,             --每页记录数
                  p_PageNo in number,               --当前页码,从 1 开始
                  p_OutRecordCount out number,   --返回总记录数
                  p_OutCursor out refCursorType);
end ZK_Pack;
--定义包主体
create or replace package body ZK_Pack is
 procedure PageSort_proc(
                  p_field in varchar2,      --要查询的字段
                  p_sql in varchar2,        --表名                         
                  p_PageSize in number,             --每页记录数
                  p_PageNo in number,               --当前页码,从 1 开始
                  p_OutRecordCount out number,   --返回总记录数
                  p_OutCursor out refCursorType)
as
    v_sql varchar2(3000);
    v_heiRownum number;
    v_lowRownum number;
begin
  ----取记录总数
  v_sql := 'select count(*) from ('|| P_sql ||')' ;
  execute immediate v_sql into p_OutRecordCount;
  ----执行分页查询
  v_heiRownum := p_PageNo * p_PageSize;
  v_lowRownum := v_heiRownum - p_PageSize + 1;
 --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn   
 --三层嵌套查询
   --v_sql := 'SELECT  ' || p_field ||  ' from (select ' || p_field  || ',rownum rn FROM( ' || p_sql || ' )WHERE rownum <= '|| to_char(v_heiRownum)||')WHERE rn >= ' || to_char(v_lowRownum);
  --两层嵌套查询
   v_sql :=  'select  ' || p_field || '  from (' || P_sql || ' and rownum<='|| to_char(v_heiRownum)||') where rn>= ' || to_char(v_lowRownum);  
  open p_OutCursor for  v_sql;
  end PageSort_proc;
 end  ZK_Pack;

 

之前写的一个 和现在的这个最大的却别在于 之前的是

v_sql :=  'select * from (' || Psql || ') where rn between ' || v_Pbegin || ' and ' || v_Pend;  

现在的是

 

v_sql :=  'select  ' || p_field || '  from (' || P_sql || ' and rownum<='|| to_char(v_heiRownum)||') where rn>= ' || to_char(v_lowRownum);  

当数据比较多得时候 select *  可能就比select id,name......要更耗资源,另外,现在采用的是三层嵌套循环效率可能比之前写的好些,期待有更优的写法

原创粉丝点击