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; /