PLSQL实现分页查询
--集合实现游标查询
CREATE OR REPLACE PACKAGE emppkg IS
TYPE t_record IS RECORD(
rn INT,
empno emp.empno%TYPE,
ename emp.ename%TYPE,
sal emp.sal%TYPE,
deptno emp.deptno%TYPE);
TYPE emplist IS TABLE OF t_record;--定义返回结果的记录集合类型
--定义实现分页显示的过程
PROCEDURE sp_page(
p_page_size IN OUT INT,--每页输出显示的记录数
p_cur_page_no IN OUT INT,--当前页码
p_outcollection OUT emplist--接收查询返回结果
);
END emppkg;
/
CREATE OR REPLACE PACKAGE BODY emppkg IS
PROCEDURE sp_page(
p_page_size IN OUT INT,--每页输出记录数
p_cur_page_no IN OUT INT,--当前页码
p_outcollection OUT emplist--接收查询返回值
)
IS
v_start_rownum NUMBER;
v_end_rownum NUMBER;
v_total_records NUMBER;
v_total_pages NUMBER;
indexvalue BINARY_INTEGER :=1;
BEGIN
--查询记录总数
SELECT COUNT(*) INTO v_total_records FROM emp;
--验证输入页面显示记录数量,确保大于0
IF p_page_size < 0 THEN
p_page_size :=10;
END IF;
--计算页面总数
IF MOD(v_total_records,v_total_pages) = 0 THEN
v_total_pages := v_total_records / p_page_size;
ELSE
v_total_pages := (v_total_records / p_page_size)+1;
END IF;
--验证页号
IF p_cur_page_no < 1 THEN
p_cur_page_no := 1;
END IF;
IF p_cur_page_no > v_total_pages THEN
p_cur_page_no := v_total_pages;
END IF;
--执行分页查询
--计算当前页开始显示的记录在整个记录中从哪开始
v_start_rownum := (p_cur_page_no-1)*p_page_size+1;
--计算当前页的最后一条记录位于哪
v_end_rownum := p_cur_page_no*p_page_size;
--构造初始化记录嵌套表
p_outcollection := emplist();
--查询记录
FOR v_emp IN (SELECT * FROM (SELECT ROWNUM rn,empno,ename,sal,deptno FROM
(SELECT empno,ename,sal,deptno FROM emp
WHERE sal IS NOT NULL
ORDER BY sal) A--选出有sal的作为表A
WHERE ROWNUM<=v_end_rownum) B
WHERE rn>=v_start_rownum)--在B中筛选去掉当前页之前的所有记录
LOOP--循环把取出的数赋给接收变量
p_outcollection.EXTEND;
p_outcollection(indexvalue):=v_emp;
indexvalue:=indexvalue+1;
END LOOP;
END sp_page;
END emppkg;
/
--游标实现分页查询
CREATE OR REPLACE PACKAGE curspkg IS
TYPE query_cursor IS REF CURSOR;
PROCEDURE sp_page(
p_page_size IN OUT INT,--每页输出记录数
p_cur_page_no IN OUT INT,--当前页码
p_sql_select VARCHAR2,--查询语句,包含排序部分
p_total_pages OUT INT,--返回总页数
p_total_records OUT INT,--返回总记录数
p_out_cursor OUT query_cursor--接收返回当前页的数据集
);
END curspkg;
/
CREATE OR REPLACE PACKAGE BODY curspkg IS
PROCEDURE sp_page(
p_page_size IN OUT INT,--每页输出记录数
p_cur_page_no IN OUT INT,--当前页码
p_sql_select VARCHAR2,--查询语句,包含排序部分
p_total_pages OUT INT,--返回总页数
p_total_records OUT INT,--返回总记录数
p_out_cursor OUT query_cursor--接收返回当前页的数据集
)
IS
v_count_sql VARCHAR2(1000);
v_start_rownum INT;
v_end_rownum INT;
v_sql VARCHAR2(4000);
BEGIN
--动态sql语句,调用输入的查询语句,计算输入的语句一共查询出多少数据
v_count_sql := 'SELECT TO_CHAR(COUNT(*)) FROM ('||p_sql_select||')';
EXECUTE IMMEDIATE v_count_sql INTO p_total_records;
--验证输入页面显示记录数量,确保大于0
IF p_page_size < 0 THEN
p_page_size :=10;
END IF;
--计算页面总数
IF MOD(p_total_records,P_total_pages) = 0 THEN
P_total_pages := p_total_records / p_page_size;
ELSE
P_total_pages := (p_total_records / p_page_size)+1;
END IF;
--验证页号
IF p_cur_page_no < 1 THEN
p_cur_page_no := 1;
END IF;
IF p_cur_page_no > P_total_pages THEN
p_cur_page_no := P_total_pages;
END IF;
--执行分页查询
--计算当前页开始显示的记录在整个记录中从哪开始
v_start_rownum := (p_cur_page_no-1)*p_page_size+1;
--计算当前页的最后一条记录位于哪
v_end_rownum := p_cur_page_no*p_page_size;
v_sql:='SELECT * FROM (SELECT ROWNUM rn,A.* FROM
('||p_sql_select||') A
WHERE ROWNUM<='||TO_CHAR(v_start_rownum)||') B
WHERE rn>='||TO_CHAR(v_end_rownum);
OPEN p_out_cursor FOR v_sql;
END sp_page;
END curspkg;
/
PLSQL实现分页查询的更多相关文章
- JdbcTemplate+PageImpl实现多表分页查询
一.基础实体 @MappedSuperclass public abstract class AbsIdEntity implements Serializable { private static ...
- 用Hibernate和Struts2+jsp实现分页查询、修改删除
1.首先用get的方法传递一个页数过去 2.通过Struts2跳转到Action 3.通过request接受主页面index传过的页数,此时页数是1, 然后调用service层的方法获取DAO层分页查 ...
- MySQL、Oracle和SQL Server的分页查询语句
假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: SELECT * FROM s ...
- 分页查询和分页缓存查询,List<Map<String, Object>>遍历和Map遍历
分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = pag ...
- mysql 分页查询
mysql,; : mysql,; -last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql; 个记录行 ,n. 动态传参的分页查询 SELECT * FROM table LI ...
- MongoDB 分页查询的方法及性能
最近有点忙,本来有好多东西可以总结,Redis系列其实还应该有四.五.六...不过<Redis in Action>还没读完,等读完再来总结,不然太水,对不起读者. 自从上次Redis之后 ...
- .NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑) 与 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB中,介绍了LiteDB的基本使用情况以及部 ...
- SubSonic3.0插件分页查询速度测试
使用SubSonic3.0一段时间了,一直都想找机会测试一下各种查询分页速度,对比一下插件的查询效率到底怎么样,所以昨天写好了测试程序,准备好1K.1W.10W.50W和100W记录的数据表,早上详细 ...
- Node.js、express、mongodb 实现分页查询、条件搜索
前言 在上一篇Node.js.express.mongodb 入门(基于easyui datagrid增删改查) 的基础上实现了分页查询.带条件搜索. 实现效果 1.列表第一页. 2.列表第二页 3. ...
随机推荐
- [LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点
Given a non-empty special binary tree consisting of nodes with the non-negative value, where each no ...
- dropzone.js使用实践
官网地址:http://www.dropzonejs.com/ 一,它是什么: DropzoneJS is an open source library that provides drag'n'dr ...
- 实验吧_简单的sql注入_1、2、3
简单的sql注入1 看着这个简单的界面,一时间没有特别好的思路,先输入一个1',发生了报错 初步猜测这是一个字符型的注入,他将我们输入的语句直接当成sql语句执行了,按题目的意思后面肯定过滤了很多注入 ...
- 坑:JavaScript 中 操作符“==” 和“===” 的区别
标题:JavaScript 中 操作符"==" 和"===" 的区别 记录一些很坑的区别: 1. '' == '0' // false 0 == '' // t ...
- [ZJOI 2013]丽洁体
Description 题库链接 给出四个字符串 \(T,A,B,C\) ,问你至少在 \(T\) 串中删去几个单词能使得 \(T\) 串变为 \(A?B?C\) 的形式,其中 \(?\) 表示任意多 ...
- ●洛谷P2606 [ZJOI2010]排列计数
题链: https://www.luogu.org/problemnew/show/P2606题解: 组合数(DP),Lucas定理 首先应该容易看出,这个排列其实是一个小顶堆. 然后我们可以考虑dp ...
- 【NOIP2013TG】solution
链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%2C30 D1T1:转圈游戏(circle) 题意: ...
- Python【第一课】 Python简介和基础
本节内容 Python安装(windows) 第一个程序(windows中的python) 变量 字符编码 注释 用户输入 模块初步认识 数据类型 数据运算 表达式if...else 表达式for l ...
- .net4.0设计模式(一)使用Lazy的单例模式
延迟加载,亦称延迟实例化,延迟初始化等, 主要表达的思想是,把对象的创建将会延迟到使用时创建,而不是在对象实例化时创建对象,即用时才加载.这种方式有助于提高于应用程序的性能,避免浪费计算,节省内存的使 ...
- mooc-python语言语法week3-6
week3 1.类型的概念:程序编程不允许有歧义的数据类型存在,所以对数据进行了划分,python语言类型分为,数字类型.字符串类型.元组类型.列表类型.文件类型.字典类型. i:数字类型: pyth ...