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. Hive HQL基本操作

    一. DDL操作 (数据定义语言) 具体参见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL 其实就是我们在创建 ...

  2. 20155305 2016-2017-2 《Java程序设计》实验四 Android开发基础设计实验报告

    实验内容 1.Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: 安装 ...

  3. noone is not in the sudoers file ubuntu

      Login as root or su to get root prompt type visudo an editor will open find a line says root ALL=( ...

  4. 微服务(SOP)日志管理

    问题: 大型企业应用规模大,调试 / 解决问题由于在生产环境中不会有开发环境的调试工具,如果需要模拟还原当时的环境, 目前的解决办法是进行日志记录 日志记录的常用方式: 使用SpringAop进行切入 ...

  5. 系统分析与设计——WordCount

    成果: https://gitee.com/ZMLJZ/codes/0k19q4upgmrfde265l7vx36 作业要求: 根据WordCount的需求描述,先编程实现,再编写单元测试,最后撰写博 ...

  6. day 6 返回值,参数

    1.函数返回值 In [3]: def divid(a,b): ...: shang = a//b ...: yushu = a%b ...: return shang,yushu ...: In [ ...

  7. CF833D Red-Black Cobweb

    题面 题解 点分治大火题... 设白边数量为$a$,黑边为$b$,则$2min(a,b)\geq max(a,b)$ 即$2a\geq b\;\&\&2b\geq a$ 考虑点分治时如 ...

  8. 属性文件操作之Properties与ResourceBundle

    1.Properties与ResourceBundle 两个类都可以读取属性文件中以key/value形式存储的键值对,ResourceBundle读取属性文件时操作相对简单. 2.Propertie ...

  9. JavaWeb(十三)——使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  10. 提取验证码到winform上webbroswer和axwebbroswer

    在网上只有webbroswer的代码,所以自己又修改了修改改成axwebbroswer的 public static class yanZhengMaHelp { //webbrowser验证码 pu ...