针对任何表写的纯Oracle分页


CREATE OR REPLACE PACKAGE
       APP_OPERATOR
       IS
         TYPE TABLE_REFCUR IS REF CURSOR;
         PROCEDURE PAGINATION(TABLE_NAME VARCHAR2,PAGE_SIZE NUMBER,CURRENT_PAGE NUMBER,DATA_LIST OUT TABLE_REFCUR,IMFOR OUT VARCHAR2,PUBLICCOLUMN VARCHAR2);   
         --TABLE_NAME VARCHAR2   表名
         --,PAGE_SIZE NUMBER,    每页条数
        -- CURRENT_PAGE NUMBER,    当前页
         --DATA_LIST OUT TABLE_REFCUR,   返回数据集
         --IMFOR OUT VARCHAR2,      系统信息
         --PUBLICCOLUMN VARCHAR2       主键
       END;
/


CREATE OR REPLACE PACKAGE BODY
       APP_OPERATOR
       IS
         PROCEDURE PAGINATION(TABLE_NAME VARCHAR2,PAGE_SIZE NUMBER,CURRENT_PAGE NUMBER,DATA_LIST OUT TABLE_REFCUR,IMFOR OUT VARCHAR2,PUBLICCOLUMN VARCHAR2)
         IS
         COU NUMBER(2);--内部存储表的记录数
         MAX_PAGE NUMBER(10);--存储表所分页的最大页数
         MAX_SIZE NUMBER(10);--每页所能分的最大条数
         DEFUALT_PAGE_SIZE NUMBER(2):=5;--默认每页条数
         DEFUALT_CURRENT_PAGE NUMBER(2):=1;--默认读取页数
         DINAMICSQL VARCHAR2(200);--动态SQl存储
         BEGIN
              --验证表的存在
              DINAMICSQL:='SELECT COUNT(*) FROM TAB WHERE TNAME=:1';
              EXECUTE IMMEDIATE DINAMICSQL INTO COU USING TABLE_NAME ;
              IF COU!=1 THEN
              RAISE_APPLICATION_ERROR(-20001,'表不存在!!!');
              END IF;
             
              --获得每页条数
              DINAMICSQL:='SELECT COUNT(*) FROM '||TABLE_NAME;
              EXECUTE IMMEDIATE DINAMICSQL INTO MAX_SIZE;
              IF PAGE_SIZE>=1 AND PAGE_SIZE<=MAX_SIZE THEN
              DEFUALT_PAGE_SIZE:=PAGE_SIZE;
              ELSE
              IMFOR:='INPUT PAGE_SIZE ILLEGE!!!  DEFUALT PAGE_SIZE=5';
              END IF;
             
              --获得总页数
              DINAMICSQL:='SELECT COUNT(*)/'||DEFUALT_PAGE_SIZE||' FROM '||TABLE_NAME;
              EXECUTE IMMEDIATE DINAMICSQL INTO MAX_PAGE;
              IF MAX_PAGE>TRUNC(MAX_PAGE) THEN
              MAX_PAGE:=TRUNC(MAX_PAGE)+1;
              END IF;
             
              IF CURRENT_PAGE>=1 AND CURRENT_PAGE<=MAX_PAGE THEN
               DEFUALT_CURRENT_PAGE:=CURRENT_PAGE;
              ELSE
              IMFOR:=IMFOR||'------'||'INPUT CURRENT_PAGE ILLEGE!!!  DEFUALT CURRENT_PAGE=1';
              END IF;
              DINAMICSQL:='SELECT B.* FROM (SELECT * FROM (SELECT ROWNUM NUM,'||TABLE_NAME||'.* FROM '||TABLE_NAME||') WHERE NUM > ('||DEFUALT_CURRENT_PAGE||'-1)*'||DEFUALT_PAGE_SIZE||' AND NUM<='||DEFUALT_CURRENT_PAGE||'*'||DEFUALT_PAGE_SIZE ||')A,'||TABLE_NAME ||' B WHERE A.'||PUBLICCOLUMN||'=B.'||PUBLICCOLUMN;
              OPEN DATA_LIST FOR DINAMICSQL;
         END;
       END;
/


DECLARE
TAABLE_NAME VARCHAR2(20):='EMP';
DINAMICSQL VARCHAR2(200);
CUR APP_OPERATOR.TABLE_REFCUR;
IMFOR VARCHAR2(40);
PUBLICCOLUMN VARCHAR2(20):='EMPNO';
ROWDATA EMP%ROWTYPE;
BEGIN
     APP_OPERATOR.PAGINATION(TAABLE_NAME,3,4,CUR,IMFOR,PUBLICCOLUMN);
     DBMS_OUTPUT.PUT_LINE(IMFOR);
     LOOP
     FETCH CUR INTO ROWDATA;
     EXIT WHEN CUR%NOTFOUND;
     DBMS_OUTPUT.put_line(ROWDATA.ENAME);
     END LOOP;
END;
/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值