oracle:储存过程实现分页

  1 CREATE OR REPLACE PACKAGE PKG_QUERY IS
  2 
  3 
  4 
  5   -- Author  : ADMINISTRATOR
  6   -- Created : 2016/12/8 星期四 10:28:37
  7   -- Purpose : 用做查询游标
  8 
  9 
 10   -- Public type declarations
 11   TYPE CUR_QUERY IS REF CURSOR;
 12 
 13 
 14 END PKG_QUERY;
 15 
 16 
 17 
 18 
 19 CREATE OR REPLACE PROCEDURE prc_query
 20        (p_tableName        in  varchar2,   --表名
 21         p_strWhere         in  varchar2,   --查询条件
 22         p_child_query      in  varchar2,   --子查询
 23         p_orderColumn      in  varchar2,   --排序的列
 24         p_orderStyle       in  varchar2,   --排序方式
 25         p_curPage          in out Number,  --当前页
 26         p_pageSize         in out Number,  --每页显示记录条数
 27         p_totalRecords     out Number,     --总记录数
 28         p_totalPages       out Number,     --总页数
 29         v_cur              out pkg_query.cur_query)   --返回的结果集
 30 IS
 31    v_sql VARCHAR2(4000) := '';      --sql语句
 32    v_startRecord Number(7);         --开始显示的记录条数
 33    v_endRecord Number(7);           --结束显示的记录条数
 34 BEGIN
 35    --记录中总记录条数
 36    v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || p_tableName || ' WHERE 1=1';
 37    IF p_strWhere IS NOT NULL  THEN
 38        v_sql := v_sql || p_strWhere;
 39    END IF;
 40    dbms_output.put_line(v_sql);
 41    EXECUTE IMMEDIATE v_sql INTO p_totalRecords;
 42    p_totalPages := 0;
 43 --   if p_totalRecords <> 0 then
 44 
 45 
 46      --验证页面记录大小
 47      IF p_pageSize < 0 THEN
 48          p_pageSize := 0;
 49      END IF;
 50 
 51 
 52      --根据页大小计算总页数
 53      IF MOD(p_totalRecords,p_pageSize) = 0 THEN
 54          p_totalPages := floor(p_totalRecords / p_pageSize);
 55      ELSE
 56          p_totalPages := floor(p_totalRecords / p_pageSize) + 1;
 57      END IF;
 58 
 59 
 60 
 61 
 62 
 63 
 64      --实现分页查询
 65      v_startRecord := (p_curPage - 1) * p_pageSize + 1;
 66      v_endRecord := p_curPage * p_pageSize;
 67      v_sql := 'SELECT b.*,' || p_child_query || ' FROM (SELECT A.*, rownum r FROM ' ||
 68               '(SELECT * FROM ' || p_tableName;
 69      IF p_strWhere IS NOT NULL  THEN
 70          v_sql := v_sql || ' WHERE 1=1 ' || p_strWhere;
 71      END IF;
 72      IF p_orderColumn IS NOT NULL THEN
 73          v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;
 74      END IF;
 75      v_sql := v_sql || ') A WHERE rownum <= ' || v_endRecord || ') B WHERE r >= '
 76               || v_startRecord;
 77      DBMS_OUTPUT.put_line(v_sql);
 78      OPEN v_cur FOR v_sql;
 79 --  end if;
 80 
 81 
 82 END prc_query;
原文地址:https://www.cnblogs.com/ios9/p/7472939.html