oracle的存储过程实现数据分页

转载 2012年08月04日 17:22:57

因为oracle 中的存储过程无法像SQLServer的存储过程直接返回结果集,所以要返回结果集就得使用引用游标,
首先定义一个包,在包中定义一个引用游标。

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,     --总页数 www@bitscn@com
        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;

Oracle存储过程分页查询

以下是Oracle存储过程分页查询返回数据集的方法: CREATE OR REPLACE PROCEDURE PROC_GET_DATA_PAGING(P_TABLENAME IN VARCH...
  • zzx3q
  • zzx3q
  • 2012-10-23 19:14:54
  • 1548

Oracle使用存储过程分页

今天我要说的就是基于Oracle存储过程的一种简单的分页方式,首先就是页面前端发起对分页的请求,然后向Oracle存储过程中传入页面当前数,页面大小,查询的SQL语句,而存储过程返回来的则是数据总条数...
  • lingyiwin
  • lingyiwin
  • 2016-04-26 17:31:49
  • 1782

Oracle分页存储过程及PLSQL中的调用脚本

撰写过程:网上搜集测试了好多的Oracle分页存储过程代码,经测试整理后终于通过测试,特分享给大家测试步骤:1运行创建包命令;2、运行创建存储过程命令;3、运行调用分页存储过程语句测试环境:windo...
  • xqf222
  • xqf222
  • 2014-06-10 16:11:24
  • 2744

使用存储过程进行分页查询

使用存储过程进行分页查询
  • hjnth
  • hjnth
  • 2016-04-09 13:36:51
  • 2160

oracle 存储过程 分页 返回结果集

/*CREATE OR REPLACE PACKAGE pkg_query AS TYPE cur_query IS REF CURSOR; END pkg_query; CREATE OR RE...
  • shuiluobu
  • shuiluobu
  • 2014-05-06 16:45:12
  • 913

Oracle 分页存储过程

  • 2010年09月13日 18:03
  • 6KB
  • 下载

存储过程分页查询(ORACLE)

CREATE OR REPLACE PACKAGE PKG_QUERY_PAGEDATA IS   -- 存储过程分页查询包.   -- 原创  : 三界.   -- CREATED : 20...
  • QQ56430204
  • QQ56430204
  • 2016-12-15 12:00:37
  • 785

C# Oracle 分页方法

方法很简单的 就不多说了. using System;using System.Collections.Generic;using System.Text;using System.Data;usin...
  • zgke
  • zgke
  • 2009-10-13 10:49:00
  • 2396

分页存储过程 oracle sql

  • 2009年03月09日 10:02
  • 5KB
  • 下载

实测 C#+存储过程 百万级数据分页

为了寻找一个高效的存储过程,对C#+mssql如下存储过程分页进行了测试,测试条件: 环境:VS2008+MSSQ2000 数据量:200万 对如下两个存储过程进行测试: 第一个: CREA...
  • love560
  • love560
  • 2012-09-11 00:20:51
  • 1589
收藏助手
不良信息举报
您举报文章:oracle的存储过程实现数据分页
举报原因:
原因补充:

(最多只允许输入30个字)