使用存储过程进行分页:page by Procedure

包头:

 1 CREATE OR REPLACE PACKAGE EMP_SIMPLE_DEMO IS
2
3 --定义一个游标
4 TYPE EMP_REF_CURSOR IS REF CURSOR;
5
6 /**
7 *分页存储过程
8 *要求可以输入表名,每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集。
9 */
10 PROCEDURE FENYE(I_TABLENAME IN VARCHAR2, --表名
11 I_PAGESIZE IN PLS_INTEGER, --页大小
12 I_PAGENOW IN PLS_INTEGER, --当前页
13 O_MYROWNUM OUT PLS_INTEGER, --总记录数量
14 O_PAGECOUNT OUT PLS_INTEGER, --总页数
15 O_CURSOR OUT EMP_REF_CURSOR --返回的记录集
16 );
17 /**
18 *自定义例外
19 *如果是SELECT语句会抛出错误,而UPDATE语句则相反。
20 */
21 PROCEDURE EX_TEST(I_EMPNO EMP.EMPNO%TYPE);
22 END EMP_SIMPLE_DEMO;

包体:

 1 CREATE OR REPLACE PACKAGE BODY EMP_SIMPLE_DEMO IS
2
3 /**
4 *分页存储过程
5 *要求可以输入表名,每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集。
6 */
7 PROCEDURE FENYE(I_TABLENAME IN VARCHAR2, --表名
8 I_PAGESIZE IN PLS_INTEGER, --页大小
9 I_PAGENOW IN PLS_INTEGER, --当前页
10 O_MYROWNUM OUT PLS_INTEGER, --总记录数量
11 O_PAGECOUNT OUT PLS_INTEGER, --总页数
12 O_CURSOR OUT EMP_REF_CURSOR --返回的记录集
13 ) IS
14 --定义部分
15 --定义SQL语句 字符串
16 V_SQL VARCHAR2(1000);
17 --定义两个整数
18 V_BEGIN NUMBER := (I_PAGENOW - 1) * I_PAGESIZE + 1; --从第几条开始 查询
19 V_END NUMBER := I_PAGENOW * I_PAGESIZE; --到第几条结束
20 BEGIN
21 --执行部分
22 --V_SQL := 'SELECT * FROM (SELECT T1.*,ROWNUM RN FROM (SELECT * FROM '|| I_TABLENAME ||') T1 WHERE ROWNUM <= :1) WHERE RN >= :2';
23 V_SQL := 'SELECT * FROM (SELECT T1.*,ROWNUM RN FROM ' || I_TABLENAME ||
24 ' T1) TT WHERE TT.RN BETWEEN :1 AND :2';
25 --打开游标
26 OPEN O_CURSOR FOR V_SQL
27 USING V_BEGIN, V_END;
28 --计算 O_MYROWNUM,O_PAGECOUNT
29 V_SQL := 'SELECT COUNT(*) FROM ' || I_TABLENAME;
30 EXECUTE IMMEDIATE V_SQL
31 INTO O_MYROWNUM;
32 --计算 O_PAGECOUNT
33 /* IF MOD(O_MYROWNUM,I_PAGESIZE) = 0 THEN
34 O_PAGECOUNT := O_MYROWNUM/I_PAGESIZE;
35 ELSE
36 O_PAGECOUNT := O_MYROWNUM/I_PAGESIZE + 1;
37 END IF;*/
38 O_PAGECOUNT := CEIL(O_MYROWNUM / I_PAGESIZE);
39 END;
40 /**
41 *自定义例外
42 *如果是SELECT语句会抛出错误,而UPDATE语句则相反。
43 */
44 PROCEDURE EX_TEST(I_EMPNO EMP.EMPNO%TYPE) IS
45 --定义一个例外
46 MYEX EXCEPTION;
47 BEGIN
48 --更新用户SAL
49 UPDATE EMP SET SAL = SAL + 100 WHERE EMP.EMPNO = I_EMPNO;
50 --SQL%NOTFOUND这是表示没有UPDATE
51 --触发MYEX例外
52 IF SQL%NOTFOUND THEN
53 RAISE MYEX;
54 END IF;
55 EXCEPTION
56 WHEN MYEX THEN
57 DBMS_OUTPUT.PUT_LINE('没有更新任何数据');
58 END;
59 END EMP_SIMPLE_DEMO;

---------------------------------------待续在JAVA中如何调用分页的存储过程--------------------------


posted on 2012-02-07 22:50  Coldest Winter  阅读(268)  评论(0编辑  收藏  举报