Oracle存储过程查询分页

1、  首先建立一个包,用户创建一个游标类型
create or replace package pkg_query as
  type cur_query is ref cursor;
end pkg_query;

2, 创建存储过程进行查询

CREATE OR REPLACE PROCEDURE prc_query
  (p_tableName in varchar2, -- 表名

  p_strWhere in varchar2, --总的Where条件
  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  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 THEN
  v_sql := v_sql || ' WHERE 1=1' || p_strWhere;
  END IF;
  IF p_orderColumn IS NOT NULL 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;

3, 测试转下篇 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值