Oracle 存储过程分页 适应FlexiGrid

CREATE OR REPLACE PACKAGE pkg_page
AS
   TYPE cur_page IS REF CURSOR;

   PROCEDURE proc_page (p_tableName      IN     varchar2,               --表名
                        p_strColumns     IN     varchar2,         --查询的字段
                        p_strWhere       IN     varchar2,           --查询条件
                        p_strOrder       IN     varchar2,               --排序
                        p_pageIndex      IN OUT Number,               --索引页
                        p_pageSize       IN OUT Number,     --每页显示记录条数
                        p_totalRecords      OUT Number,             --总记录数
                        p_totalPages        OUT Number,               --总页数
                        cur_ret             OUT pkg_page.cur_page); --返回的结果集
END pkg_page;

CREATE OR REPLACE PACKAGE BODY pkg_page
AS
   PROCEDURE proc_page (p_tableName      IN     varchar2,               --表名
                        p_strColumns     IN     varchar2,         --查询的字段
                        p_strWhere       IN     varchar2,           --查询条件
                        p_strOrder       IN     varchar2,               --排序
                        p_pageIndex      IN OUT Number,               --索引页
                        p_pageSize       IN OUT Number,     --每页显示记录条数
                        p_totalRecords      OUT Number,             --总记录数
                        p_totalPages        OUT Number,               --总页数
                        cur_ret             OUT pkg_page.cur_page) --返回的结果集
   IS
      v_sql           VARCHAR2 (4000) := '';                         --sql语句
      v_startRecord   Number (10);                        --开始显示的记录条数
      v_endRecord     Number (10);                        --结束显示的记录条数
   BEGIN
      --记录中总记录条数
      v_sql := 'SELECT COUNT(rownum) FROM ' || p_tableName || ' WHERE 1=1';

      IF p_strWhere IS NOT NULL OR p_strWhere <> ''
      THEN
         v_sql := v_sql || p_strWhere;
      END IF;

      EXECUTE IMMEDIATE v_sql INTO   p_totalRecords;

      --验证页面记录大小
      IF p_pageSize < 0
      THEN
         p_pageSize := 20;
      END IF;

      --根据页大小计算总页数[Page]
      IF MOD (p_totalRecords, p_pageSize) = 0
      THEN
         p_totalPages := p_totalRecords / p_pageSize;
      ELSE
         p_totalPages := p_totalRecords / p_pageSize + 1;
      END IF;

      --验证页号
      IF p_pageIndex < 1
      THEN
         p_pageIndex := 1;
      END IF;

      IF p_pageIndex > p_totalPages
      THEN
         p_pageIndex := p_totalPages;
      END IF;

      --实现分页查询
      v_startRecord := (p_pageIndex - 1) * p_pageSize + 1;
      v_endRecord := p_pageIndex * p_pageSize;
      v_sql :=
            'SELECT '
         || p_strColumns
         || ' FROM (SELECT A.*, rownum r FROM '
         || '(SELECT * FROM '
         || p_tableName;

      IF p_strWhere IS NOT NULL OR p_strWhere <> ''
      THEN
         v_sql := v_sql || ' WHERE 1=1' || p_strWhere;
      END IF;

      IF p_strOrder IS NOT NULL OR p_strOrder <> ''
      THEN
         v_sql := v_sql || p_strOrder || ' ';
      END IF;

      v_sql :=
            v_sql
         || ') A WHERE rownum <= '
         || v_endRecord
         || ') B WHERE r >= '
         || v_startRecord;

      --DBMS_OUTPUT.put_line (v_sql);

      OPEN cur_ret FOR v_sql;
   END proc_page;
END;

posted @ 2010-05-19 15:19  尹庆超  阅读(406)  评论(0编辑  收藏  举报