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. ...
随机推荐
- 一个web程序员的年终总结
2017年年终总结(就是一个程序员的瞎叨叨): 从来到中科院到现在,很开心可以在这留下来.毕竟对于我来说,这里符合我对自己毕业后前两年的规划.我是一个很慢的人,特别是对于我想做好的事情,我会非常认真仔 ...
- 【Swift】图文混排,ios开发中在textfield或textView中插入图片
在ios开发中,我们一般都是在textfield或者textView中输入文字.当我们需要插入图片的时候其实也是很简单的 我们需要利用的textfield,textView的属性化文本,将图片以附件的 ...
- Multipath在OpenStack中的faulty device的成因及解决(part 2)
| 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 简介 在上次的文章M ...
- HDU2108和HDU2036(叉乘)
hdu2108 判断是否为凸边形 判断连续三点的叉乘 若为凸,内角<180:若为凹,内角>180 所以通过正负来判断 #include <iostream> #include ...
- 【CODEVS 6384 大米兔学全排列】
·大米兔学习全排列,还有一些逆序对,还有一棵二叉索引树.· ·分析: 首先肯定不是像题目上说的那样,使用next_permutation去完成这道题,因为就算是线性的它也不能承受庞大的排列 ...
- of_alias_get_id 函数与设备树中aliases节点的关系【转】
转自:https://blog.csdn.net/qq_30145093/article/details/78053823?locationNum=10&fps=1 转自http://www. ...
- Xtrabackup2.4.8备份、还原、恢复Mysql5.7.19实操
环境:CentOS 6.7 + Mysql 5.7.19 + Xtraback 2.4.8 innobackupex常用参数: --user=USER 指定备份用户,不指定的话为当前系统用户 --p ...
- C#+HtmlAgilityPack+Dapper走一波爬虫
最近因为公司业务需要,又有机会撸winform了,这次的需求是因为公司有项目申报的这块业务,项目申报前期需要关注政府发布的相关动态信息,政府部门网站过多,人工需要一个一个网站去浏览和查阅,有时候还会遗 ...
- Spring MVC - 表单处理示例
环境搭建 环境: Intellij IDEA Spring MVC 完整的项目文件结构如下所示: Student.java package com.ktao.controller; public cl ...
- 求n的阶乘
import java.util.Scanner; public class J { public static void main(String args[]) { //注释:int n=6 ...