? --sunfruit
建立存儲(chǔ)過程,存儲(chǔ)過程為:
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS
BEGIN
??? OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
END TESTC;
可以看到,它是把游標(biāo)(可以理解為一個(gè)指針),作為一個(gè)out 參數(shù)來返回值的。
在java里調(diào)用時(shí)就用下面的代碼:
package com.hyq.src;
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;
public class TestProcedureTHREE {
? public TestProcedureTHREE() {
? }
? public static void main(String[] args ){
??? String driver = "oracle.jdbc.driver.OracleDriver";
??? String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
??? Statement stmt = null;
??? ResultSet rs = null;
??? Connection conn = null;
??? try {
????? Class.forName(driver);
????? conn =? DriverManager.getConnection(strUrl, "hyq", "hyq");
????? CallableStatement proc = null;
????? proc = conn.prepareCall("{ call hyq.testc(?) }");
????? proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
????? proc.execute();
????? rs = (ResultSet)proc.getObject(1);
????? while(rs.next())
????? {
????????? System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");
????? }
??? }
??? catch (SQLException ex2) {
????? ex2.printStackTrace();
??? }
??? catch (Exception ex2) {
????? ex2.printStackTrace();
??? }
??? finally{
????? try {
??????? if(rs != null){
????????? rs.close();
????????? if(stmt!=null){
??????????? stmt.close();
????????? }
????????? if(conn!=null){
??????????? conn.close();
????????? }
??????? }
????? }
????? catch (SQLException ex1) {
????? }
??? }
? }
}
在這里要注意,在執(zhí)行前一定要先把oracle的驅(qū)動(dòng)包放到class路徑里,否則會(huì)報(bào)錯(cuò)的。