CREATE OR REPLACE PACKAGE PACK_PAGINATION AS
PAGESIZE CONSTANT NUMBER := 2;
TYPE TYRECORD_EMP IS RECORD(
EMPNO EMP.EMPNO%TYPE,
ENAME EMP.ENAME%TYPE,
JOB EMP.JOB%TYPE,
MGR EMP.MGR%TYPE,
HIREDATE EMP.HIREDATE%TYPE,
SAL EMP.SAL%TYPE,
COMM EMP.COMM%TYPE,
DEPTNO EMP.DEPTNO%TYPE);
TYPE RECORD_EMP IS TABLE OF TYRECORD_EMP; FUNCTION FUN_PAGINATION(CURRENTPAGE NUMBER) RETURN RECORD_EMP
PIPELINED;
END; CREATE OR REPLACE PACKAGE BODY PACK_PAGINATION AS
FUNCTION FUN_PAGINATION(CURRENTPAGE NUMBER) RETURN RECORD_EMP
PIPELINED AS
EMP_ROW EMP%ROWTYPE;
REC_EMP TYRECORD_EMP;
COUNTNUM NUMBER;
PAGENUM NUMBER;
E_EXP1 EXCEPTION;
EXP1_STRING VARCHAR2(1000) := '输入页数过大!';
E_EXP2 EXCEPTION;
PRAGMA EXCEPTION_INIT(E_EXP2, -06553);
CURSOR CURSOR_EMP IS
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM (SELECT EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO,
ROWNUM RN
FROM EMP
WHERE ROWNUM <= (CURRENTPAGE - 1) * PAGESIZE + PAGESIZE)
WHERE RN > (CURRENTPAGE - 1) * PAGESIZE
ORDER BY DEPTNO;
BEGIN SELECT COUNT(1) INTO COUNTNUM FROM EMP;
PAGENUM := COUNTNUM / PAGESIZE;
IF CURRENTPAGE > PAGENUM THEN
RAISE E_EXP1;
ELSE
OPEN CURSOR_EMP;
LOOP
FETCH CURSOR_EMP
INTO EMP_ROW;
EXIT WHEN CURSOR_EMP%NOTFOUND;
REC_EMP.EMPNO := EMP_ROW.EMPNO;
REC_EMP.ENAME := EMP_ROW.ENAME;
REC_EMP.JOB := EMP_ROW.JOB;
REC_EMP.MGR := EMP_ROW.MGR;
REC_EMP.HIREDATE := EMP_ROW.HIREDATE;
REC_EMP.SAL := EMP_ROW.SAL;
REC_EMP.COMM := EMP_ROW.COMM;
REC_EMP.DEPTNO := EMP_ROW.DEPTNO;
PIPE ROW(REC_EMP);
END LOOP;
END IF;
CLOSE CURSOR_EMP;
RETURN;
EXCEPTION
WHEN E_EXP1 THEN
DBMS_OUTPUT.PUT_LINE(EXP1_STRING || '每页显示' || PAGESIZE || '条, 共计' ||
PAGENUM || '页!');
WHEN E_EXP2 THEN
DBMS_OUTPUT.PUT_LINE('触发了ORA-06553 错误!' || SQLERRM);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);
END FUN_PAGINATION;
END;

----代码优化 后

 --以上代码的优化 ;
CREATE OR REPLACE PACKAGE SPILE_PAGE AS PAGESIZE NUMBER := 5;
TYPE TYRECORD_EMP IS RECORD(
EMPNO EMP.EMPNO%TYPE,
ENAME EMP.ENAME%TYPE,
JOB EMP.JOB%TYPE,
MGR EMP.MGR%TYPE,
HIREDATE EMP.HIREDATE%TYPE,
SAL EMP.SAL%TYPE,
COMM EMP.COMM%TYPE,
DEPTNO EMP.DEPTNO%TYPE);
REC_EMP TYRECORD_EMP;
TYPE TABLE_EMP_RECORD IS TABLE OF TYRECORD_EMP ;
FUNCTION FUN_PAGINATION1(CURRENTPAGE NUMBER) RETURN TABLE_EMP_RECORD
PIPELINED ;
END SPILE_PAGE; CREATE OR REPLACE PACKAGE BODY SPILE_PAGE AS
FUNCTION FUN_PAGINATION1(CURRENTPAGE NUMBER)
RETURN TABLE_EMP_RECORD
PIPELINED AS
PAGESIZE NUMBER := 5;
CURSOR CURSOR_EMP IS
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM (SELECT E.*, ROWNUM RN
FROM EMP E
WHERE ROWNUM <= (CURRENTPAGE - 1) * PAGESIZE + PAGESIZE)
WHERE RN >= (CURRENTPAGE - 1) * PAGESIZE;
BEGIN
--优化部分 ;
OPEN CURSOR_EMP;
LOOP
FETCH CURSOR_EMP
INTO REC_EMP;
EXIT WHEN CURSOR_EMP%NOTFOUND;
PIPE ROW(REC_EMP);
END LOOP;
CLOSE CURSOR_EMP;
RETURN;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE || SQLERRM);
END FUN_PAGINATION1;
END SPILE_PAGE ;
SELECT * FROM TABLE(SPILE_PAGE.FUN_PAGINATION1(3)) ;

自己编写 Oracle 分页函数的更多相关文章

  1. Oracle分页函数(存储过程)

    create or replace package body Get_RecordByPage is StrSQL ); --分页函数 procedure GetRecordByPage(tblNam ...

  2. Oracle特有函数 case when decode exists 分页rownum

    select * from EMP eselect * from dept dselect * from salgrade s--Oracle特有函数 case whenselect case 2 w ...

  3. Oracle over函数

    Oracle over函数   SQL code: sql over的作用及用法RANK ( ) OVER ( [query_partition_clause] order_by_clause )DE ...

  4. Oracle 分页原理

    oracle rownum 及分页处理的使用方法 在实际应用中我们经常碰到这样的问题,比如一张表比较大,我们只要其中的查看其中的前几条数据,或者对分页处理数据.在这些情况下我们都需要用到rownum. ...

  5. mysql和oracle 分页查询(转)

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...

  6. Oracle管道函数(Pipelined Table Function)介绍

    一 概述: 1.管道函数即是能够返回行集合(能够使嵌套表nested table 或数组 varray)的函数,我们能够像查询物理表一样查询它或者将其  赋值给集合变量. 2.管道函数为并行运行,在普 ...

  7. Oracle 分页方法研究

    1.Oracle 中的三大分页方法 1.1.通过分析函数分页 1.2.通过 ROWNUM 分页 1.3.通过 ROWID 分页 2.Oracle 分页解决方案浅析 2.1.纯后端代码完成分页 2.2. ...

  8. Oracle分析函数——函数列表

    --------------聚合函数 SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于计算 ...

  9. [转]oracle分页用两层循环还是三层循环?

    select t2.* from --两层嵌套 (select t.* , rownum as row_numfrom t where rownum <=20) t2 where t2.row_ ...

随机推荐

  1. python学习笔记(二):基础知识点

    python基本元素 7 // 2 3 7 % 3 1 # 取商以及余数 divmod(7,3) (2, 1) 1j*1j (-1+0j) 10/3 3.3333333333333335 '3,''1 ...

  2. DotNetty学习笔记

    DotNetty项目本身的示例很容易运行起来,但是具体到真实的应用场景,还是需要进一步理解DotNetty的通道处理细节,这样才能够在实际项目应用中处理具体的问题. 简单的场景下会有以下几个问题,第一 ...

  3. 20155330 2016-2017-2 《Java程序设计》第四周学习总结

    20155330 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 学习目标 理解封装.继承.多态的关系 理解抽象类与接口的区别 掌握S.O.L.I.D原则 了 ...

  4. Java——RMI

    之前分布式系统调用用的是比较老的EJB,当时还是作为服务调用方,去调用别的系统的服务.最近发现新公司里面,用的是RMI,查了下发现EJB的底层实现就是RMI,也算是熟悉了... 一,使用JDK 中的R ...

  5. LumiSoft.Net 收发邮件

    一:LumiSoft.Net简介 Lumisoft is a software development company specialised in mobile phones and tablets ...

  6. Oracle的集合运算符

    Oracle的集合运算符有并集union.union all,交集intersect,差集minus 先建表myemp,进行集合运算的测试 create table myemp as select * ...

  7. Vue学习计划基础笔记(二) - 模板语法,计算属性,侦听器

    模板语法.计算属性和侦听器 目标: 1.熟练使用vue的模板语法 2.理解计算属性与侦听器的用法以及应用场景 1. 模板语法 <div id="app"> <!- ...

  8. 【sed】常用命令

    替换 替换某一整行 sed '1c hello' test #将第一行替换为hello str1替换为str2 sed 's/^str1.*/str2/' filename #以str1开头 sed ...

  9. 【第二章】MySQL数据库基于Centos7.3-部署

    一.MySQL数据库的官方网址: https://www.mysql.com/ https://www.oracle.com/ http://dev.mysql.com/doc/refman/5.7/ ...

  10. 导出Office365中的组及成员

    Set-ExecutionPolicy unrestricted $cred = Get-Credential  $session = New-PSSession -ConfigurationName ...