自己编写 Oracle 分页函数
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 分页函数的更多相关文章
- Oracle分页函数(存储过程)
create or replace package body Get_RecordByPage is StrSQL ); --分页函数 procedure GetRecordByPage(tblNam ...
- Oracle特有函数 case when decode exists 分页rownum
select * from EMP eselect * from dept dselect * from salgrade s--Oracle特有函数 case whenselect case 2 w ...
- Oracle over函数
Oracle over函数 SQL code: sql over的作用及用法RANK ( ) OVER ( [query_partition_clause] order_by_clause )DE ...
- Oracle 分页原理
oracle rownum 及分页处理的使用方法 在实际应用中我们经常碰到这样的问题,比如一张表比较大,我们只要其中的查看其中的前几条数据,或者对分页处理数据.在这些情况下我们都需要用到rownum. ...
- mysql和oracle 分页查询(转)
最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...
- Oracle管道函数(Pipelined Table Function)介绍
一 概述: 1.管道函数即是能够返回行集合(能够使嵌套表nested table 或数组 varray)的函数,我们能够像查询物理表一样查询它或者将其 赋值给集合变量. 2.管道函数为并行运行,在普 ...
- Oracle 分页方法研究
1.Oracle 中的三大分页方法 1.1.通过分析函数分页 1.2.通过 ROWNUM 分页 1.3.通过 ROWID 分页 2.Oracle 分页解决方案浅析 2.1.纯后端代码完成分页 2.2. ...
- Oracle分析函数——函数列表
--------------聚合函数 SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于计算 ...
- [转]oracle分页用两层循环还是三层循环?
select t2.* from --两层嵌套 (select t.* , rownum as row_numfrom t where rownum <=20) t2 where t2.row_ ...
随机推荐
- 【Mac】安装 Homebrew 出错 Failed during: git fetch origin master:refs/remotes/origin/master --tags --force
今天在 Mac 装 Homebrew 遇到了一个问题,在网上找了大量解决方案,做个总结. Mac 版本 High Sierra 10.13.6. 问题描述 在 Mac 终端输入了 Homebrew 官 ...
- 郁金香指标开源库的使用--(tulipindicators-0.8.4)
瞎逛发现最新出了这么一个指标库,有100多种指标的函数库,文档写的比较好,重要的是作者一直在维护. 把它编成库,然后测试一下,可用于自动交易,策略交易等开发. 1.下载地址 https://githu ...
- 2016-2017-2 20155302 实验四 Android 开发基础
2016-2017-2 20155302 实验四 Android 开发基础 实验内容 1.下载和安装Android Studio 2.学会使用Android Studio进行简单的Android开发 ...
- C# Disable CTRL-ALT-DEL, ALT-TAB, ALT-F4, Start Menu and so on…
使用C#禁用系统的某些特定按键 原文地址:http://www.tamas.io/c-disable-ctrl-alt-del-alt-tab-alt-f4-start-menu-and-so-on/ ...
- python3出现转码问题的总结
对于此(类)问题: (1)出现UnicodeEncodeError –> 说明是Unicode编码时候的问题: (2) ‘gbk’ codec can’t encode character –& ...
- Easyui 控件的初始化方法
问题: Easyui的控件在初始化的时候有两种方式: 页面指定class属性 js里初始化该id为easyui的控件 那么问题是: 如果页面不指定class属性,只是使用js初始化的话,会导致无法用控 ...
- runtime如何实现weak属性
首先了解weak是一种非拥有关系,属性所值对象销毁时,属性值会清空(nil). Runtime对注册的类会进行布局,对于weak对象会放入hash表中,用weak指向的内存地址作为key,当对象引用计 ...
- JavaWeb(十七)——JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- Linux TCP/IP调优参数 /proc/sys/net/目录
所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数,后面是它们的含义: /proc/sys/net/core/rmem_default " ...
- python基础数据类型补充
python_day_7 一. 今日主要内容: 1. 补充基础数据类型的相关知识点 str. join() 把列表变成字符串 列表不能再循环的时候删除. 因为索引会跟着改变 字典也不能直接循环删除.把 ...