Java获取Oracle存储过程返回的Cursor

存储过程:
Package Head:
CREATE OR REPLACE PACKAGE TEST IS
  --返回cursor
  TYPE CURSOR_RESULT IS REF CURSOR;
  PROCEDURE GET_CURSOR_RESULT(P_STARTINDEX IN INT,
                              P_LIMIT      IN INT,
                              P_DEAL_TYPE  IN VARCHAR2,
                              CR           OUT CURSOR_RESULT);
END TEST;

Package Body:
CREATE OR REPLACE PACKAGE BODY TEST IS
PROCEDURE GET_CURSOR_RESULT(P_STARTINDEX IN INT,
                              P_LIMIT      IN INT,
                              P_DEAL_TYPE  IN VARCHAR2,
                              CR           OUT CURSOR_RESULT) IS
  
     BEGIN
       OPEN CR FOR
         SELECT T.*
           FROM (SELECT SDD.ID, SDD.FCU, SDD.FCD, ROWNUM RN
                FROM SDDTEST SDD
               WHERE DEAL_TYPE = P_DEAL_TYPE) T
           WHERE T.RN >= P_STARTINDEX
           AND T.RN < P_STARTINDEX + P_LIMIT;
    END GET_CURSOR_RESULT;
END TEST;
Java代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtil {
	private static String DB_CONNECT_STR = "jdbc:oracle:thin:@10.25.18.29:1593:test";
	private static String DB_USER = "scott";
	private static String DB_PASS = "tiger";
	public static DBUtil dbUtil = new DBUtil();
	private Connection con = null;
	
	private DBUtil() {
		try {
			// 推荐使用这个驱动,不推荐oracle.jdbc.driver.OracleDriver
			Class.forName("oracle.jdbc.OracleDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public Connection getConnection() throws SQLException {
		if (con == null)
			con = DriverManager.getConnection(DB_CONNECT_STR,DB_USER,DB_PASS);
		return con;
	}
}

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import oracle.jdbc.OracleCallableStatement;

/**
 * 1.java中获取Oracle存储过程返回的Cursor。    
 * @author QCD
 *
 */
public class OracleCursorResultTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Connection con = null;
		OracleCallableStatement ocs = null;
		ResultSet rs = null;
		String sql = "{call test.GET_CURSOR_RESULT(?,?,?,?)}";
	
		try {
			con = DBUtil.dbUtil.getConnection();
			ocs = (OracleCallableStatement) con.prepareCall(sql);
			ocs.setInt(1, 10);
			ocs.setInt(2, 20);
			ocs.setString(3, "01");
			ocs.registerOutParameter(4,oracle.jdbc.OracleTypes.CURSOR);
			ocs.execute();
				
			rs = ocs.getCursor(4);
			while (rs.next()) {
				String tradeno = rs.getString("id");
				String fcu = rs.getString("fcu");
				Date fcd = rs.getDate("fcd");
				System.out.println("tradeno:" + tradeno + ",fcu:" + fcu + ",fcd:" + fcd);
			}
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null)rs.close();
				if(ocs!=null)ocs.close();
				if(con!=null)con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
注:使用ojdbc6.jar,此版本支持JDK6,支持JDBC 4.0。



猜你喜欢

转载自luckystar2008.iteye.com/blog/1908724