zoukankan      html  css  js  c++  java
  • 自己编写 Oracle 分页函数

     1 CREATE OR REPLACE PACKAGE PACK_PAGINATION AS
     2   PAGESIZE CONSTANT NUMBER := 2;
     3   TYPE TYRECORD_EMP IS RECORD(
     4     EMPNO    EMP.EMPNO%TYPE,
     5     ENAME    EMP.ENAME%TYPE,
     6     JOB      EMP.JOB%TYPE,
     7     MGR      EMP.MGR%TYPE,
     8     HIREDATE EMP.HIREDATE%TYPE,
     9     SAL      EMP.SAL%TYPE,
    10     COMM     EMP.COMM%TYPE,
    11     DEPTNO   EMP.DEPTNO%TYPE);
    12   TYPE RECORD_EMP IS TABLE OF TYRECORD_EMP;
    13 
    14   FUNCTION FUN_PAGINATION(CURRENTPAGE NUMBER) RETURN RECORD_EMP
    15     PIPELINED;
    16 END;
    17 
    18 CREATE OR REPLACE PACKAGE BODY PACK_PAGINATION AS
    19   FUNCTION FUN_PAGINATION(CURRENTPAGE NUMBER) RETURN RECORD_EMP
    20     PIPELINED AS
    21     EMP_ROW  EMP%ROWTYPE;
    22     REC_EMP  TYRECORD_EMP;
    23     COUNTNUM NUMBER;
    24     PAGENUM  NUMBER;
    25     E_EXP1 EXCEPTION;
    26     EXP1_STRING VARCHAR2(1000) := '输入页数过大!';
    27     E_EXP2 EXCEPTION;
    28     PRAGMA EXCEPTION_INIT(E_EXP2, -06553);
    29     CURSOR CURSOR_EMP IS
    30       SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
    31         FROM (SELECT EMPNO,
    32                      ENAME,
    33                      JOB,
    34                      MGR,
    35                      HIREDATE,
    36                      SAL,
    37                      COMM,
    38                      DEPTNO,
    39                      ROWNUM RN
    40                 FROM EMP
    41                WHERE ROWNUM <= (CURRENTPAGE - 1) * PAGESIZE + PAGESIZE)
    42        WHERE RN > (CURRENTPAGE - 1) * PAGESIZE
    43        ORDER BY DEPTNO;
    44   BEGIN
    45   
    46     SELECT COUNT(1) INTO COUNTNUM FROM EMP;
    47     PAGENUM := COUNTNUM / PAGESIZE;
    48     IF CURRENTPAGE > PAGENUM THEN
    49       RAISE E_EXP1;
    50     ELSE
    51       OPEN CURSOR_EMP;
    52       LOOP
    53         FETCH CURSOR_EMP
    54           INTO EMP_ROW;
    55         EXIT WHEN CURSOR_EMP%NOTFOUND;
    56         REC_EMP.EMPNO    := EMP_ROW.EMPNO;
    57         REC_EMP.ENAME    := EMP_ROW.ENAME;
    58         REC_EMP.JOB      := EMP_ROW.JOB;
    59         REC_EMP.MGR      := EMP_ROW.MGR;
    60         REC_EMP.HIREDATE := EMP_ROW.HIREDATE;
    61         REC_EMP.SAL      := EMP_ROW.SAL;
    62         REC_EMP.COMM     := EMP_ROW.COMM;
    63         REC_EMP.DEPTNO   := EMP_ROW.DEPTNO;
    64         PIPE ROW(REC_EMP);
    65       END LOOP;
    66     END IF;
    67     CLOSE CURSOR_EMP;
    68     RETURN;
    69   EXCEPTION
    70     WHEN E_EXP1 THEN
    71       DBMS_OUTPUT.PUT_LINE(EXP1_STRING || '每页显示' || PAGESIZE || '条, 共计' ||
    72                            PAGENUM || '页!');
    73     WHEN E_EXP2 THEN
    74       DBMS_OUTPUT.PUT_LINE('触发了ORA-06553 错误!' || SQLERRM);
    75     WHEN OTHERS THEN
    76       DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);
    77   END FUN_PAGINATION;
    78 END;

     ----代码优化 后

     1 --以上代码的优化 ;
     2 CREATE OR REPLACE PACKAGE  SPILE_PAGE AS 
     3 
     4   PAGESIZE NUMBER := 5;
     5   TYPE TYRECORD_EMP IS RECORD(
     6     EMPNO    EMP.EMPNO%TYPE,
     7     ENAME    EMP.ENAME%TYPE,
     8     JOB      EMP.JOB%TYPE,
     9     MGR      EMP.MGR%TYPE,
    10     HIREDATE EMP.HIREDATE%TYPE,
    11     SAL      EMP.SAL%TYPE,
    12     COMM     EMP.COMM%TYPE,
    13     DEPTNO   EMP.DEPTNO%TYPE);
    14   REC_EMP TYRECORD_EMP;
    15     TYPE TABLE_EMP_RECORD IS TABLE OF TYRECORD_EMP ;
    16     FUNCTION FUN_PAGINATION1(CURRENTPAGE NUMBER)   RETURN TABLE_EMP_RECORD
    17   PIPELINED ;
    18     END SPILE_PAGE;
    19     
    20 
    21 CREATE OR REPLACE PACKAGE BODY SPILE_PAGE AS 
    22     FUNCTION  FUN_PAGINATION1(CURRENTPAGE NUMBER)
    23   RETURN TABLE_EMP_RECORD
    24   PIPELINED AS
    25   PAGESIZE NUMBER := 5;
    26   CURSOR CURSOR_EMP IS
    27     SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
    28       FROM (SELECT E.*, ROWNUM RN
    29               FROM EMP E
    30              WHERE ROWNUM <= (CURRENTPAGE - 1) * PAGESIZE + PAGESIZE)
    31      WHERE RN >= (CURRENTPAGE - 1) * PAGESIZE;
    32 BEGIN
    33     --优化部分 ;
    34   OPEN CURSOR_EMP;
    35   LOOP
    36     FETCH CURSOR_EMP
    37       INTO REC_EMP;
    38     EXIT WHEN CURSOR_EMP%NOTFOUND;
    39     PIPE ROW(REC_EMP);
    40   END LOOP;
    41   CLOSE CURSOR_EMP;
    42   RETURN;
    43 EXCEPTION
    44   WHEN OTHERS THEN
    45     DBMS_OUTPUT.PUT_LINE(SQLCODE || SQLERRM);
    46 END FUN_PAGINATION1;
    47 END SPILE_PAGE ;
    48 SELECT * FROM TABLE(SPILE_PAGE.FUN_PAGINATION1(3)) ;
    View Code
  • 相关阅读:
    班会记录
    CSS之伪元素
    JavaScript之返回顶部
    尝试Hexo
    GitHub之上传文件
    Git之使用
    Git之基本命令
    运行第一个Node.js程序
    go语言圣经 map 章节习题
    go语言圣经第4章JSON部分习题
  • 原文地址:https://www.cnblogs.com/linbo3168/p/6038214.html
Copyright © 2011-2022 走看看