ORACLE 自定义分页存储过程
一、创建包
CREATE OR REPLACE PACKAGE PKG_JK_LAB_BASIC
IS
TYPE CURSOR_TYPE IS REF CURSOR; PROCEDURE SP_GET_PAGINATION (
pi_tableName in varchar2, --表名
pi_where in varchar2, --查询条件
pi_columns in varchar2, --查询列集合
pi_orderColumn in varchar2, --排序的列
pio_curPage in out Number, --当前页
pio_pageSize in out Number, --每页显示记录条数
po_totalRecords out Number, --总记录数
po_totalPages out Number, --总页数
po_cur out CURSOR_TYPE); END PKG_JK_LAB_BASIC;
二、创建包体
CREATE OR REPLACE PACKAGE BODY PKG_JK_LAB_BASIC
IS PROCEDURE SP_GET_PAGINATION
(pi_tableName in varchar2, --表名
pi_where in varchar2, --查询条件
pi_columns in varchar2, --查询列集合
pi_orderColumn in varchar2, --排序的列
pio_curPage in out Number, --当前页
pio_pageSize in out Number, --每页显示记录条数
po_totalRecords out Number, --总记录数
po_totalPages out Number, --总页数
po_cur out CURSOR_TYPE) --返回的结果集
IS
v_sql VARCHAR2(1000) := ''; --sql语句
v_startRecord Number(4); --开始显示的记录条数
v_endRecord Number(4); --结束显示的记录条数
v_where VARCHAR2(500) := '';
v_orderColumn VARCHAR2(200) := '';
v_columns VARCHAR2(200) := '';
BEGIN
--记录中总记录条数
v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || pi_tableName; v_where := TRIM(NVL(pi_where,''));
IF LENGTH(v_where)>0 THEN
v_where := ' WHERE ' || pi_where || ' ';
v_sql := v_sql || v_where;
END IF; v_orderColumn := TRIM(NVL(pi_orderColumn,''));
IF LENGTH(v_orderColumn)>0 THEN
v_orderColumn := ' ORDER BY ' || v_orderColumn || ' ';
END IF; EXECUTE IMMEDIATE v_sql INTO po_totalRecords; IF pio_pageSize <= 0 THEN
pio_pageSize := 10;
END IF; --根据页大小计算总页数
po_totalPages := CEIL( po_totalRecords / pio_pageSize); IF pio_curPage < 1 THEN
pio_curPage := 1;
END IF; IF pio_curPage > po_totalPages THEN
pio_curPage := po_totalPages;
END IF; --实现分页查询
v_startRecord := (pio_curPage - 1) * pio_pageSize + 1;
v_endRecord := pio_curPage * pio_pageSize;
v_columns := TRIM(NVL(pi_columns,'')); IF LENGTH(v_columns)>0 AND v_columns <> '*' THEN
v_sql := 'SELECT * FROM (SELECT '|| v_columns ||', ROWNUM RowNumber FROM ' ||
'(SELECT '|| v_columns ||' FROM ' || pi_tableName || v_where || v_orderColumn || '))'||
' WHERE RowNumber <= ' || v_endRecord || ' AND RowNumber >= ' || v_startRecord ;
ELSE
v_sql := 'SELECT * FROM (SELECT A.*, ROWNUM RowNumber FROM ' ||
'(SELECT * FROM ' || pi_tableName || v_where || v_orderColumn || ') A )'||
' WHERE RowNumber <= ' || v_endRecord || ' AND RowNumber >= ' || v_startRecord ;
END IF; DBMS_OUTPUT.put_line(v_sql); OPEN po_cur FOR v_sql; END SP_GET_PAGINATION; END PKG_JK_LAB_BASIC;
ORACLE 自定义分页存储过程的更多相关文章
- Oracle通用分页存储过程的创建与使用
Oracle通用分页存储过程的创建与使用 1.创建Oracle包的定义.使用 REF CURSOR 数据类型来处理 Oracle 结果集.REF CURSOR 是一个指向 PL/SQL 查询所返回的结 ...
- Oracle 创建分页存储过程(转帖)
原贴地址:http://19880614.blog.51cto.com/4202939/1316560 ps:源代码还有很多错误,我修改了 ------------------------------ ...
- oracle高效分页存储过程(百万数据级)
create or replace procedure Pager( page in number,--数据页数,从1开始 pageSize in number,--每页大小 tableName nv ...
- Oracle数据库使用存储过程实现分页
注:本示例来源于韩顺平[10天玩转oracle数据库]视频教程 1.创建包同时创建游标 create or replace package pagingPackage is type paging_c ...
- Oracle分页存储过程及PLSQL中的调用脚本
撰写过程:网上搜集测试了好多的Oracle分页存储过程代码,经整理后终于通过测试,特分享给大家 测试步骤:1.运行创建包命令;2.运行创建存储过程命令;3.运行调用分页存储过程语句 测试环境:wind ...
- Oracle实践--PL/SQL综合之分页存储过程
Oracle PL/SQL分页的存储过程 Oracle,分页,存储过程三个词结合起来,来个综合点的小练习,运用之前的PL/SQL创建一个分页的存储过程,仅仅须要简单几步就可以. 1.声明一个引用游标 ...
- Oracle自定义函数和存储过程示例,自定义函数与存储过程区别
参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...
- C# DataGridView自定义分页控件
好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...
- Mybatis下配置调用Oracle自定义函数返回的游标结果集
在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...
随机推荐
- Centos7.0安装配置PHP7.0
YUM安装所需开发包 yum install wget make gcc gcc-c++ bison autoconf patch \ pcre-devel zlib-devel openssl-de ...
- curl详解
用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...
- 循环结构——whlie do whlie for for each
1. while循环 while(循环条件){ (特点为:先判断再执行) 循环操作 } 例题: 计算1+2+3+...+100 int i = 1; int sum = 0; wh ...
- css高级应用及问题记录(持续更新)
css 参考手册: 1.http://css.doyoe.com/ 1.混合选择器样式定义: .button.icon:before { content: ""; po ...
- javascript父级鼠标移入移出事件中的子集影响父级的处理方法
一.我们先分析其产生的原因: 1.当鼠标从父级移入子集时触发了父级的两个事件:a.父级的mouseout事件(父级离开到子集):b.由于事件冒泡影响,又触发了父级的mouseover事件(父级移入父级 ...
- AspNetPager 免费分页控件7.5.1版发布!
AspNetPager 免费分页控件7.5.1版发布,本次升级主要内容有: 修正了ShowDisabledButtons为false时html闭合标签丢失的bug:改为从System.Web.UI.W ...
- idea 从github下载项目提示 file name too long 的解决方案
1.找到git shell命令行 2运行如下命令 git config --global core.longpaths true 附地址https://github.com/Strider-CD/st ...
- 确定比赛名次---HDU1285(拓扑排序)
http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目大意: 给你每场比赛的成绩,让你根据成绩把排名弄出来 分析: 本来我是用普通方法写的,然后就一直wa, ...
- 解决php中json_decode的异常JSON_ERROR_CTRL_CHAR
该字符中含了ASCII码ETB控制符,即\x17导致json解析失败 (截图中显示ETB是因为用了Sublime text2) 解决方法如下:去掉0-31的控制符再进行decode $result = ...
- CRC 冗余校验计算
(1)设G(x)为r阶,则在信息位末尾加r个0形成新信息 r=原信息位数 - 1