`
zhaoshijie
  • 浏览: 2262087 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle存储过程通用分页

 
阅读更多

关键字:oracle存储过程通用分页



说明:如果 不能满足您的业务请进行适量的修改



一、sql代码


1、首先建立一个包,用户创建一个游标类型


create or replace package pkg_query as 
  type cur_query is ref cursor;  
end pkg_query;


2、创建存储过程

CREATE OR REPLACE PROCEDURE prc_query  
       (p_tableName        in  varchar2,   --表名  
        p_strWhere         in  varchar2,   --查询条件  
        p_orderColumn      in  varchar2,   --排序的列  
        p_orderStyle       in  varchar2,   --排序方式  
        p_curPage          in out Number,  --当前页  
        p_pageSize         in out Number,  --每页显示记录条数  
        p_totalRecords     out Number,     --总记录数  
        p_totalPages       out Number,     --总页数  
        v_cur              out pkg_query.cur_query)   --返回的结果集  
IS 
   v_sql VARCHAR2(1000) := '';      --sql语句  
   v_startRecord Number(4);         --开始显示的记录条数  
   v_endRecord Number(4);           --结束显示的记录条数  
BEGIN 
   --记录中总记录条数  
   v_sql := 'SELECT TO_NUMBER(COUNT(*)) 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 := 0;  
   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_curPage < 1 THEN 
       p_curPage := 1;  
   END IF;  
   IF p_curPage > p_totalPages THEN 
       p_curPage := p_totalPages;  
   END IF;  
     
   --实现分页查询  
   v_startRecord := (p_curPage - 1) * p_pageSize + 1;  
   v_endRecord := p_curPage * p_pageSize;  
   v_sql := 'SELECT * 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_orderColumn IS NOT NULL or p_orderColumn <> '' THEN 
       v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;  
   END IF;  
   v_sql := v_sql || ') A WHERE rownum <= ' || v_endRecord || ') B WHERE r >= ' 
            || v_startRecord;  
   DBMS_OUTPUT.put_line(v_sql);  
   OPEN v_cur FOR v_sql;  
END prc_query;




3、java调用代码:

  
 
import java.sql.CallableStatement;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
 
public class TestProcedureFenye {  
 
    public static void main(String[] args) {  
        Connection conn = null;  
        CallableStatement cs = null;  
        String user = "system";  
        String password = "lilifen";  
        String url = "jdbc:oracle:thin:@localhost:1521:lilifen";  
        try {  
            Class.forName("oracle.jdbc.driver.OracleDriver");  
            conn = DriverManager.getConnection(url, user, password);  
            cs = conn.prepareCall("{call prc_query(?,?,?,?,?,?,?,?,?)}");
           
//            call prc_query('stu','','','',0,2);
            cs.setString(1, "stu");  
            cs.setString(2, "");  
            cs.setString(3, "");  
            cs.setString(4, "");
            cs.setInt(5, 0);
            cs.setInt(6, 2);
            // 设置返回值类型  
            cs.registerOutParameter(7, oracle.jdbc.OracleTypes.NUMBER);  
            cs.registerOutParameter(8, oracle.jdbc.OracleTypes.NUMBER);  
            cs.registerOutParameter(9, oracle.jdbc.OracleTypes.CURSOR);  
            cs.execute();  
            int allRows = cs.getInt(7);  
            int allPages = cs.getInt(8);  
            ResultSet rs = (ResultSet) cs.getObject(9);
            while(rs.next()){
            System.out.println(rs.getInt(1));
            System.out.println(rs.getString("name"));
            }
            System.out.println("page="+allRows + " " + allPages);  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        } finally {  
            if (cs != null) {  
                try {  
                    cs.close();  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
            }  
            if (conn != null) {  
                try {  
                    conn.close();  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
 






4、附件是 创建测试表的 sql 欢迎下载使用!!!
  • stu.rar (326 Bytes)
  • 下载次数: 14
分享到:
评论

相关推荐

    通用ORACLE存储过程实现分页和查询

    总结来说,Oracle存储过程实现分页查询的关键在于动态构造SQL语句,结合ROWNUM或ROW_NUMBER()来实现分页。理解这一机制有助于我们在处理大量数据时编写高效、可复用的代码。在实际应用中,根据具体需求和数据库设计...

    oracle查询分页条件通用存储过程

    oracle数据库的查询分页加条件和排序的通用型存储过程,通过将表名以参数的形式传入到存储过程中做到多表通用,也可以是多表关联的sql语句 将其看作一个表也能调用该存储过程,分页只需要传与页数,和每页显示的行数...

    Oracle通用数据库存储过程代码--高效分页存储过程

    ### Oracle通用数据库存储过程代码——高效分页存储过程解析 #### 标题解析 标题“Oracle通用数据库存储过程代码——高效分页存储过程”表明这是一个适用于Oracle数据库的存储过程,主要用于实现高效的分页查询功能...

    Oracle数据库通用的分页存储过程

    Oracle数据库中实现分页查询主要有两种方法:ROWNUM和ROW_NUMBER()函数,这里我们主要讨论通过存储过程实现的通用分页方法。 一、ROWNUM方法 ROWNUM是Oracle数据库中的一个伪列,它会为每一行分配一个唯一的整数,...

    oracle和mssql分页存储过程-均通用

    要实现Oracle和MSSQL的通用分页存储过程,可以使用动态SQL。首先,根据数据库类型选择合适的分页语句,然后将分页参数(如页号、每页记录数)传入存储过程。这需要对两种数据库的语法有一定了解,并且可能需要处理...

    Oracle通用分页存储过程

    "Oracle通用分页存储过程"就是为了解决这个问题而设计的。分页存储过程通常包含一系列SQL语句和逻辑,用于从数据库中按指定条件获取特定页码的数据。 在Oracle数据库中,实现分页查询通常涉及到`ROWNUM`伪列或者`...

    ASP.NET基于通用存储过程的分页

    本主题将深入探讨如何在ASP.NET中利用通用存储过程实现分页。 首先,理解存储过程的概念是至关重要的。存储过程是在数据库中预编译的SQL语句集合,它能够执行特定的任务,如查询、插入、更新或删除数据。在分页场景...

    Oracle分页存储过程

    "Oracle分页存储过程"就是将分页查询的逻辑封装到一个存储过程中,使得在多个地方调用分页查询时更为便捷。 创建一个简单的分页存储过程,我们可以定义两个输入参数:一个是起始记录的索引(通常为1),另一个是每...

    经典的分页、排序SQL 通用存储过程.rar

    本文将详细解析"经典的分页、排序SQL 通用存储过程"所涉及的知识点,并给出如何实现这样的存储过程。 首先,分页是数据库查询中的一种优化策略,用于限制每次查询返回的结果数量,从而避免一次性加载大量数据导致的...

    从项目中剥离出来的通用存储过程分页源代码

    原项目中使用Oracle存储过程进行分页,前端借助AspNetPager控件进行分页控制,使用简单方便,并可容易地实现绑定控件(如GridView)的自动编号列功能。现将数据库改用SqlServer2000,经测试,能很好地实现分页功能,...

    Mybatis通用分页插件

    Mybatis通用分页插件通过自动处理分页参数,极大地简化了这一过程。 该插件的核心功能包括: 1. **智能分页**:根据不同的数据库(如MySQL、Oracle、SQL Server等)自动生成对应的分页SQL,无需手动编写LIMIT或...

    通用的分页存储过程,内置的函数、内连接、左外连接

    在提供的`.sql`文件中,很可能是包含了创建这样一个通用分页存储过程的代码,可能包含示例的使用方法。分析和理解这个文件将有助于进一步理解和应用这些概念。在实际操作中,应根据具体的数据库系统(如MySQL、SQL ...

    一个通用的分页存储过程与在aspx页面中调用的方法

    ### 通用分页存储过程与ASPX页面中的调用方法 #### 一、分页存储过程概述 在数据库操作中,分页是非常常见且重要的功能之一。尤其在处理大量数据时,分页能够显著提高用户体验并减少服务器负载。本文介绍了一个...

    java通用分页代码实例.rar

    这个"java通用分页代码实例"提供了一种适用于任意数据库的解决方案,具有高可移植性和易用性。 分页的核心在于对数据库查询结果进行分割,只返回当前页面所需的数据,同时提供翻页链接或按钮,允许用户浏览更多的...

    存储过程之jQuery分页源码

    - "Portal"、"DataBase"、"Common"、"DBUtility":这些可能是项目中的文件夹,分别代表门户模块、数据库相关、通用功能和数据库辅助工具类,DBUtility可能包含了与存储过程相关的操作函数。 结合这些资源,我们可以...

    jsp通用分页

    【jsp通用分页】是指在Java Web开发中,利用JSP技术实现数据库查询结果的分页展示。在处理大量数据时,为了提高用户体验和减轻服务器压力,通常会采用分页的方式来展示数据。JDBC(Java Database Connectivity)作为...

    oracle-pagehelper-通用mapper-easyui-SSM框架示例

    综上所述,"oracle-pagehelper-通用mapper-easyui-SSM框架示例"是一个完整的Java Web项目,利用SSM框架连接Oracle数据库,通过PageHelper实现分页查询,通用Mapper简化数据库操作,EasyUI构建用户友好的前端界面。...

    C#版Oracle数据库通用操作类

    ### C# 版 Oracle 数据库通用操作类解析 在现代软件开发中,数据库操作是必不可少的一部分,而 C# 结合 Oracle 数据库的应用尤为广泛。本文将深入探讨一个用于简化 Oracle 数据库操作的 C# 类——`ConnForOracle`。...

    Oracle的SQL分页实践.pdf

    通过理解rownum的工作原理和使用存储过程实现通用分页逻辑,开发者可以更加灵活地处理数据的分页显示问题。需要注意的是,rownum是在结果集确定之前就赋予行号的,所以不能在结果集确定后再用rownum进行过滤,否则...

Global site tag (gtag.js) - Google Analytics