欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle 分页存储过程的实现

程序员文章站 2022-07-08 15:59:57
...

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

 

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();
			}
		}
	}
}