`

Oracle 分页存储过程的实现

阅读更多

首先创建一个包,包中包含一个游标,这个游标用于分页存储过程返回记录集。

 

CREATE OR REPLACE PACKAGE P_CURSOR
AS
       TYPE  PAGE_CURSOR IS REF CURSOR;
END P_CURSOR;
 

创建分页存储过程:

CREATE OR REPLACE PROCEDURE PAGINATION(
       V_TABLENAME VARCHAR2,
       V_PAGENOW IN NUMBER,
       V_PAGESIZE IN NUMBER,
       V_ROWCOUNT OUT NUMBER,
       V_PAGECOUNT OUT NUMBER,
       RS_CURSOR OUT P_CURSOR.PAGE_CURSOR)
IS
       V_SQL VARCHAR2(1000);
       V_ROWFROM NUMBER;
       V_ROWTO NUMBER; 
BEGIN
       V_ROWFROM := (V_PAGENOW - 1) * V_PAGESIZE + 1;
       V_ROWTO := V_PAGENOW * V_PAGESIZE;
       V_SQL := 'SELECT * FROM (SELECT T.*,ROWNUM RN FROM (SELECT ROWNUM,EMP.* FROM '|| V_TABLENAME ||') T WHERE ROWNUM <=' || V_ROWTO || ') WHERE RN >=' || V_ROWFROM;
       OPEN RS_CURSOR FOR V_SQL;
      --CLOSE RS_CURSOR;
       V_SQL := 'SELECT COUNT(*) FROM ' || V_TABLENAME;
       EXECUTE IMMEDIATE V_SQL INTO V_ROWCOUNT;
       IF MOD(V_ROWCOUNT, V_PAGESIZE) = 0 THEN
          V_PAGECOUNT := V_ROWCOUNT/V_PAGESIZE;
       ELSE
          V_PAGECOUNT := V_ROWCOUNT/V_PAGESIZE + 1;
       END IF;
END;
     

存储过程中打开的游标并没有关闭,原因是该存储过程向外输出游标,如果关闭,会导致JAVA端获取不到游标。

当JAVA程序调用存储过程后,该游标自动关闭。

 

创建用于测试的JAVA程序:

package com.cool.Exercises;

import java.sql.*;
public class Pagination {
	public static void main(String args[]){
		Connection ct = null;
		CallableStatement cs = null;
		ResultSet rs = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:COOL", "scott", "tiger");
			cs = ct.prepareCall("{call PAGINATION(?,?,?,?,?,?)}");
			cs.setString(1, "EMP");
			cs.setInt(2, 1);
			cs.setInt(3, 10);
			cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
			cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
			cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
			cs.execute();
			
			int rowCount = cs.getInt(4);
			int pageCount = cs.getInt(5);
			rs = (ResultSet)cs.getObject(6);
			
			System.out.println(" rowCount = " + rowCount);
			System.out.println(" pageCount = " + pageCount);
			while(rs.next()){
				System.out.print(" " + rs.getInt(1));
				System.out.print(" "  + rs.getString(2));
				System.out.print(" " + rs.getString(3));
				System.out.print(" " + rs.getString(4));
				System.out.print(" " + rs.getString(5));
				System.out.print(" " + rs.getString(6));
				System.out.print(" " + rs.getString(7));
				System.out.println(" " + rs.getString(8));
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				if(rs != null){
					rs.close();
				}
				if(cs != null){
					cs.close();
				}
				if(ct != null){
					ct.close();
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}
分享到:
评论
1 楼 ainishigai 2012-03-11  
  学习了啊 
     哥们儿你太好了 下次能发表多表插入的动态语句吗  谢谢

相关推荐

    oracle分页存储过程

    oracle分页存储过程,oracle分页存储过程

    Oracle 分页存储过程 终极版

    总的来说,"Oracle分页存储过程 终极版"是一个针对大数据量查询优化的解决方案,它通过高效的分页策略和存储过程封装,实现了快速、可控的分页查询,提升了用户体验并减轻了数据库的负载。在实际开发中,这样的工具...

    Oracle分页存储过程

    oracle分页存储过程详细的编码 可直接使用 拿去使用吧

    Oracle 分页存储过程

    在Oracle数据库中,分页查询是一项...总的来说,通过精心设计的存储过程,我们可以实现高效的多条件Oracle分页查询,同时确保查询性能不受数据量的影响。在实际应用中,应根据具体情况进行调整和优化,以达到最佳效果。

    ORACLE分页存储过程

    在分页存储过程中,主要理解了变量的动态赋值和输入输出参数的使用就非常简单了 下面为调用方法: var c_Preccount number; var c_Ppagecount number; var c_cur refcursor; exec proc_SpPag(1,'SELECT * FROM T_...

    Oracle 分页的存储过程

    总结来说,Oracle分页存储过程是通过动态构造SQL语句,结合输入的分页参数,计算出总页数,并返回指定页的数据。这种方式在处理大量数据时提高了效率,同时也提供了灵活的查询控制。通过包装这些逻辑在存储过程中,...

    Oracle 分页存储过程 SQL

    Oracle 分页存储过程 SQL Oracle 分页存储过程 SQL

    asp.net使用oracle分页存储过程查询数据

    功能说明 写好oracle的连接字符串和查询语句,调用程序中的方法可以很方便的实现分页功能。该方法中,将参数连接字符串,查询的sql语句,... 效率不是很高,如有高人写出很厉害的分页存储过程,希望您与大家分享。

    带排序的oracle分页存储过程

    ### 带排序的Oracle分页存储过程 在开发Web应用程序的过程中,分页是一个非常常见的需求。为了提高系统的性能及可维护性,采用存储过程来实现分页逻辑是一种较为推荐的做法。下面将详细介绍如何利用Oracle数据库中...

    oracle 分页 存储过程

    oracle 分页 存储过程,超级牛的分页存储过程,执行后可以直接实用,分页速度刚刚的

    ibatis调用oracle存储过程分页

    ibatis调用oracle存储过程分页

    oracle分页查询并返回总记录数据存储过程

    Oracle 数据库提供了多种方法来实现分页查询,其中使用存储过程是一种高效且灵活的方式。本文将详细介绍如何在 Oracle 中创建一个用于分页查询并返回总记录数的存储过程。 #### 核心概念 1. **存储过程**:存储在...

    oracle调用存储过程实现分页

    本篇文章将深入探讨如何在Oracle中通过调用存储过程实现分页功能。 首先,我们需要创建一个存储过程,这个过程将接收两个参数:起始记录编号(一般为当前页数乘以每页显示的记录数)和每页的记录数。存储过程内部会...

    java调用oracle分页存储过程

    Java调用Oracle分页存储过程是一项常见的数据库操作,尤其在处理大数据量时,为了提高查询效率和用户体验,分页查询显得尤为重要。Oracle数据库提供了一种高效的方法,即通过创建存储过程来实现分页功能,而Java作为...

    oracle分页存储过程千万级

    本文将基于给定的“oracle分页存储过程千万级”文件信息,深入解析其核心概念、设计思路及实现细节。 ### 核心概念解析 #### 1. 存储过程(Stored Procedure) 存储过程是一种预编译的SQL代码块,存储在数据库...

Global site tag (gtag.js) - Google Analytics