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 ...
随机推荐
- Amoeba+Mysql实现数据库读写分离
一.Amoeba 是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明.具有负载均衡.高可用性.sql过滤.读写分离 ...
- DBlink与同义词
DBLink就是数据库链接,而同义词就已经具体到某个用户下的表了 原文链接:http://www.linuxidc.com/Linux/2013-01/77579.htm 这里所需要的信息: 从MM库 ...
- mysql load file
1.MySql加载本地文件至数据库 -- 加载本地数据文件 Load Data InFile 'localfile' Into Table datatablename Fields Terminate ...
- 【笔记】android sdk集成的eclipse中导入项目
android sdk集成的eclipse中导入项目 想要把旧的ADT项目,一模一样的导入进来,需要: 1.把项目放到,非当前ADT的workspace目录下: 2.从Project中Import,选 ...
- linq查询一个字段的总和
(from s in dc.StockInItem //所要查询单表 join si in dc.StockIn //联合的表 on s.StockInID equals si ...
- ASP.NET控件<ASP:Button /> html控件<input type="button">区别联系
ASP.NET控件<ASP:Button />-------html控件<input type="button">杨中科是这么说的:asp和input是一样 ...
- delphi真随机数发生器
当然不是绝对真随机,是相对真随机数 下载
- python smtplib发送邮件遇到的认证问题
python的smtplib模块主要是用来发送邮件的,使用起来比较方便. 使用程序发送邮件只需要写以下几行代码就OK了: #!/usr/bin/env python import smtplib s ...
- linux开机启动程序
一./etc/rc.local这是一个最简单的方法,编辑“/etc/rc.local”,把启动程序的shell命令输入进去即可(要输入命令的全路径),类似于windows下的“启动”. 使用命令 vi ...
- Spring overview
引子 接触Java很多年了,各种framework,却从未系统的去了解过.最近突然想清楚一件事,就是当下的目标——Focus on Java-based RESTful WS & JS.而之于 ...