首先创建一个包,包中包含一个游标,这个游标用于分页存储过程返回记录集。
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();
}
}
}
}
分享到:
相关推荐
oracle分页存储过程,oracle分页存储过程
Oracle分页存储过程,里面包含C#调用代码实例;
高效多条件 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调用存储过程实现分页,分页,过程,存储,oracle
功能说明 写好oracle的连接字符串和查询语句,调用程序中的方法可以很方便的实现分页功能。该方法中,将参数连接字符串,查询的sql语句,... 效率不是很高,如有高人写出很厉害的分页存储过程,希望您与大家分享。
Oracle 存储过程 Oracle分页 oracle分页
oracle 分页 存储过程,超级牛的分页存储过程,执行后可以直接实用,分页速度刚刚的
Oracle的分页查询语句以及Oracle分页的存储过程
Oracle存储过程分页代码 Oracle存储过程分页代码 Oracle存储过程分页代码 Oracle存储过程分页代码 Oracle存储过程分页代码
Oracle分页存储过程,根据指定条件分页 并附上使用示例(C#代码) 注:不能查询视图或者包含distinct、group by、inner join的子句
ibatis调用oracle存储过程分页
java调用oracle分页存储过程,存储过程保存在sql文件夹下,可以直接运行。 实现了输入表名、每页显示记录数、当前页、排序字段,返回总记录数,总页数,和结果集。
几乎每一个WEB应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案。 --之所以用存储过程,是因为以后...
oracle分页查询并返回总记录数据的存储过程