您的位置:首页 > 数据库 > Oracle

oracle 分页存储过程

2009-07-10 23:49 337 查看
oracle 分页存储过程

--建立一个包,用户创建一个游标类型
  create or replace package pkg_query as
  type cur_query is ref cursor;
  end pkg_query;
  --创建存储过程
  create OR REPLACE PROCEDURE prc_query
  (p_tableName in varchar2, --表名
  p_strwhere in varchar2, --查询条件 --*
  p_orderColumn in varchar2, --排序的列 --*
  p_orderStyle in varchar2, --排序方式 --*
  p_curPage in out Number, --当前页
  p_pageSize in out Number, --每页显示记录条数
  p_totalRecords out Number, --总记录数 --*
  p_totalPages out Number, --总页数
  v_cur out pkg_query.cur_query) --返回的结果集
  IS
  v_sql VARchar2(1000) := ''; --sql语句
  v_startRecord Number(4); --开始显示的记录条数
  v_endRecord Number(4); --结束显示的记录条数
  BEGIN
  --记录中总记录条数
  v_sql := 'select TO_NUMBER(count(*)) FROM ' || p_tableName || ' where 1=1';
  IF p_strwhere IS NOT NULL or p_strwhere <> '' THEN
  v_sql := v_sql || p_strwhere;
   END IF;
  execute IMMEDIATE v_sql INTO p_totalRecords;

  --验证页面记录大小
  IF p_pageSize < 0 THEN
   p_pageSize := 0;
  END IF;

   --根据页大小计算总页数
  IF MOD(p_totalRecords,p_pageSize) = 0 THEN
   p_totalPages := p_totalRecords / p_pageSize;
  ELSE
   p_totalPages := p_totalRecords / p_pageSize + 1;
   END IF;

  --验证页号
  IF p_curPage < 1 THEN
   p_curPage := 1;
  END IF;
  IF p_curPage > p_totalPages THEN
   p_curPage := p_totalPages;
   END IF;

  --实现分页查询
  v_startRecord := (p_curPage - 1) * p_pageSize + 1;
  v_endRecord := p_curPage * p_pageSize;
   v_sql := 'select * FROM (select A.*, rownum r FROM ' ||
   '(select * FROM ’ || p_tableName;
   IF p_strwhere IS NOT NULL or p_strwhere <> '' THEN
   v_sql := v_sql ||' where 1=1' || p_strwhere;
   END IF;
   IF p_orderColumn IS NOT NULL or p_orderColumn <> '' THEN
   v_sql := v_sql ||' ORDER BY ' || p_orderColumn ||'' || p_orderStyle;
   END IF;
   v_sql := v_sql || ') A where rownum <= ' || v_endRecord ||') B where r >=

   || v_startRecord;
   DBMS_OUTPUT.put_line(v_sql);
  OPEN v_cur FOR v_sql;
  END prc_query;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: