各位大侠:
小弟的存储过程get_log_byriqi比较简单,有两个输入参数。
在java代码中去调用这个存储过程,主要代码如下
 CallableStatement proc = conn.prepareCall("{call get_log_byriqi(?,?)}");
 proc.setString(1,"20071001");
 proc.setString(2,"20071030"); ResultSet rs = proc.executeQuery();但是接下来写的代码
while(rs.next())
{....
}
或者rs.absolute(1);
都会出现异常:对只转发结果集的无效操作: absolute以前这个问题我也遇到过,当时不是用的存储过程,而是select直接查询,在Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY)中加入
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY就好了;这次我把proc写成
proc = conn.prepareCall(strSQL,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY)
却不行这个问题怎么解决啊!谢谢

解决方案 »

  1.   

    在储存过程中定义一个输出参数为游标类型
    参考这个例子:
    CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS BEGIN     OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB; END TESTC; 可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。 在java里调用时就用下面的代码: 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 = "...";     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) {       }     }   } }