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

  • 相关阅读:
    Commander Nodejs 命令行接口
    数据库集群 ---续集
    数据库集群
    实时查看linux下的日志
    自动化测试
    python中list和dict
    super与this的用法
    数据类型
    父类调用子类方法
    子类调用父类方法
  • 原文地址:https://www.cnblogs.com/asingna/p/1739248.html
Copyright © 2020-2023  润新知