ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【笔记】分页存储过程

【笔记】分页存储过程

原创 Linux操作系统 作者:klamm0 时间:2009-11-25 16:18:17 0 删除 编辑

这个存储过程是用 row_number()   over(partation by col1 order by col2) 来实现的:

1、创建包

SQL> CREATE OR REPLACE PACKAGE pagination_package IS
  2         TYPE pagination_cursor IS REF CURSOR;
  3         PROCEDURE total_records(
  4                   table_name IN VARCHAR2, --表
  5                   total_num OUT INTEGER --总记录数
  6         );
  7         PROCEDURE pagination(
  8                   curr_page IN INTEGER,  --当前页数
  9                   records_pre_page IN INTEGER,  --每页显示记录数
 10                   table_name IN VARCHAR2,  --表名
 11                   --partitionBy_field IN VARCHAR2, --分组
 12                   orderBy_field IN VARCHAR2, --排序
 13                   total_pages OUT INTEGER,  --总页数
 14                   v_cursor OUT pagination_cursor  --接收游标
 15         );
 16  END;
 17  /

Package created

Executed in 0.015 seconds

2、创建包体,并实现存储过程

SQL> CREATE OR REPLACE PACKAGE BODY pagination_package AS
  2         PROCEDURE total_records(
  3                   table_name IN VARCHAR2, --表
  4                   total_num OUT INTEGER --总记录数
  5         ) AS
  6              v_sql VARCHAR2(2000);
  7              v_totalCount INTEGER;
  8         BEGIN
  9              v_sql := 'SELECT COUNT(*) FROM '|| table_name;
 10              EXECUTE IMMEDIATE v_sql INTO v_totalCount;
 11              total_num := v_totalCount;
 12         END total_records;
 13 
 14         PROCEDURE pagination(
 15                   curr_page IN INTEGER,  --当前页数
 16                   records_pre_page IN INTEGER,  --每页显示记录数
 17                   table_name IN VARCHAR2,  --表名
 18                   --partitionBy_field IN VARCHAR2, --分组
 19                   orderBy_field IN VARCHAR2, --排序
 20                   total_pages OUT INTEGER,  --总页数
 21                   v_cursor OUT pagination_cursor  --接收游标
 22         ) AS
 23              v_sql VARCHAR2(2000);
 24              v_start INTEGER;
 25              v_end INTEGER;
 26              v_totalPage INTEGER;
 27         BEGIN
 28              v_sql := 'SELECT COUNT(*) FROM '|| table_name;
 29              EXECUTE IMMEDIATE v_sql INTO v_totalPage;
 30              total_pages := ceil(v_totalPage/records_pre_page); --总页数
 31              v_end := curr_page * records_pre_page;--每页结束值
 32              v_start := v_end - records_pre_page + 1;--每页开始值
 33              --IF orderBy_field IS NOT NULL THEN
 34                 v_sql := 'SELECT * FROM
 35                       (SELECT t.*, row_number() over(ORDER BY '|| orderBy_field ||' ) rn FROM '|| table_name ||' t)
 36                       WHERE rn BETWEEN '|| v_start ||' AND '|| v_end;
 37              OPEN v_cursor FOR v_sql;
 38         END pagination;
 39  END;
 40  /

Package body created

Executed in 0.015 seconds

3、测试(在JAVA中)略

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22786751/viewspace-620536/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-10-30

  • 博文量
    58
  • 访问量
    58090