自己编写 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_ ...
随机推荐
- week8课上实践
课上练习. 第一题: 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成"求命令行传入整数参数的和" ...
- js想不通的地方
1.js函数的function() 为什么能接受那么多参数,这些参数的名字顺序必须固定还是怎么? 怎么知道调用的时候会发送该参数过去?内部原理?手动传输? 2.js对象,json对象,java对象怎么 ...
- 人脸识别引擎SeetaFaceEngine中Identification模块使用的测试代码
人脸识别引擎SeetaFaceEngine中Identification模块用于比较两幅人脸图像的相似度,以下是测试代码: int test_recognize() { const std::stri ...
- day9 匿名函数 lambda
1. list列表排序 #### sort排序 nums = [,,,,,] nums.sort() print(nums) ### 结果 [, , , , , ] ######## 逆序 In [] ...
- mysql学习----支持Emoji表情
但发现了一个问题,iPhone上有Emoji表情,插入Mysql时失败了,报如下异常: java.sql.SQLException: Incorrect string value: '\xF0\x9F ...
- 探究linux设备驱动模型之——platform虚拟总线(一)
说在前面的话 : 设备驱动模型系列的文章主要依据的内核版本是2.6.32的,因为我装的Linux系统差不多就是这个版本的(实际上我用的fedora 14的内核版本是2.6.35.13的.) ...
- ffmpeg 压缩H265 Windows 硬件编码
硬件NVIDIA:ffmpeg.exe -i input.avi -c:v hevc_nvenc -preset:v fast output.mp4 软件 :ffmpeg.exe - ...
- vue-cli的安装使用
通过 npm install vue 安装vue 后: 1.打开cmd 输入 npm install --global vue-cli 全局安装vue-cli脚手架 输入 vue -V 返回vue-c ...
- Ubuntu常用shell命令
目录 ls cd mkdir mv cp scp rm df du chmod chown chgrp head tail screen apt-get Ubuntu常用shell命令 Ubuntu作 ...
- TW实习日记:前三天
今天是2018年7月20号,周五.从周一开始实习到现在,终于想起来要写日记这种东西了,可以记录一下自己这一天所学所做所知也是蛮不错的.先简单总结一下自己的大学生活吧,算是多姿多彩,体验了很多东西.在大 ...