Oracle 存储过程之通用分页查询

在数据库中书写通用分页存储过程,有利于代码的维护以及执行效率的提升

 

create or replace procedure Sp_QueryDatePage
(
              tableName in varchar2,--表名
              fieldes  in  varchar2,---查询结果显示字段
              wherecase in  varchar2,---查询条件
              pageSize  in number, --页记录数
              pageNow in number,--当前页
          orderField  varchar2,-排序字段,为空表示不排序
              orderFlag  number,- 排序标识 0:正序 1: 倒序
              myrows out number ,--总记录数
              myPageCount out number ,---总分页
              p_cursor out  SP_QueryDatePackage.SP_QueryDate_cursor ----返回记录数
)    is

v_sql varchar2(10000);

--定义两个整数
v_begin number:=(pageNow -1)* pageSize+1; --开始记录
v_end   number:=pageNow* pageSize;       -- 结束记录

--排序sql
v_orderSql varchar2(100):='';
v_wherecase varchar2(1000):='';

 begin
    -- 判定排序
    if orderFiled is not null  then 
         if orderFlag =0 then 
           v_orderSql:='ordey by'|| orderField'
         else if  orderFlag =1 then 
           v_orderSql:='ordey by'|| orderField||desc;
         else
            null;
         end if;
    end if;
 
   --条件语句
  if  v_wherecase is not null then
      v_wherecase :='where' || wherecase;
  end  if;
  v_sql:='select * from 
          (select t1.*,rownum rn from (select '||fields||'from'||tablename|| v_wherecase||''|| v_orderSql ||') t1 where rownum<='||v_end||') 
           where  rn >='|| v_begin
--把游标和sql关联
open p_curson  for v_spl;
--计算myrow 和MypageCount

v_sql :='select count(*) from '||tableName||v_wherecase||''||v_orderSql;

execute immediate  v_sql  into myrows;

-- 计算myPageCount (页数)
if mod(myrows,Pagesize)=0 then
   myPageCount:=myrows/Pagesize;
else 
  myPageCount:=myrows/Pagesize+1;

 end if;

 

posted @ 2015-12-02 16:56  sucer德  阅读(663)  评论(0编辑  收藏  举报