2010-09-17 68 views
2

sqlj.runtime.ExecutionContext.OracleContext中的oracleClose()和oracleCloseQuery()是做什麼的。來自Oracle PL/SQL存儲過程的JDBC結果集

由於我們升級JDBC驅動程序罐子ojdbc5.jar與在該oracleClose()使用resultset.next(),而不是與oracleCloseQuery()當finally塊,我們得到以下例外。使用oracleCloseQuery()安全嗎?該數據庫是Oracle 11g和WAS 6.1.X.X.感謝您的迴應。 以下是錯誤消息:

java.sql.SQLException中:封閉聲明:下 在oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) 在oracle.jdbc.driver.DatabaseError .newSQLException(DatabaseError.java:131) 在oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:197) 在oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261) 在oracle.jdbc .driver.DatabaseError.throwSqlException(DatabaseError.java:269) at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:205) at com.westgroup.pubsvc.r ms.models.ResultSetSRC.getNextResult(ResultSetSRC.java:112)

回答

6

唯一的例外是告訴你,當你試圖遍歷ResultSet已返回此ResultSetStatement是被關閉。這表示您正在使用ResultSet外部try塊,其中Statement已執行,並且您可能使用ResultSet作爲方法的返回值。這是一個壞習慣

我建議你重寫你的JDBC代碼所以已經執行的ResultSet在同樣的try塊作爲Statement被處理,或這些方法返回像爲List<Entity>,而不是ResultSet

這裏是正確的JDBC成語的開球例如:

public List<Entity> list() throws SQLException { 
    // Declare resources. 
    Connection connection = null; 
    Statement statement = null; 
    ResultSet resultSet = null; 
    List<Entity> entities = new ArrayList<Entity>(); 

    try { 
     // Acquire resources. 
     connection = database.getConnection(); 
     statement = connection.createStatement("SELECT id, name, value FROM entity"); 
     resultSet = statement.executeQuery(); 

     // Gather data. 
     while (resultSet.next()) { 
      Entity entity = new Entity(); 
      entity.setId(resultSet.getLong("id")); 
      entity.setName(resultSet.getString("name")); 
      entity.setValue(resultSet.getInteger("value")); 
      entities.add(entity); 
     } 
    } finally { 
     // Close resources in reversed order. 
     if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} 
     if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} 
     if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
    } 

    // Return data. 
    return entities; 
} 

順便說一句,你不要在這裏需要Oracle JDBC驅動程序特定的類/方法。這一切都只是java.sql.*。這樣您可以將JDBC代碼保存在數據庫中。

+0

感謝您的回覆。該方法返回Resultset並在執行finally塊後稍後使用,這不是一種好的做法,但使用Oracle JDBC Driver版本 - 「10.2.0.1.0」。而這段代碼是Jpublisher從存儲過程生成的java代碼。那麼這是否意味着我們需要更改存儲過程。 – Lalitha 2010-09-17 16:25:52

+1

我不確定JPublisher在做什麼,但是在類似方法之外傳遞'ResultSet'是一個壞主意。您不需要更改存儲過程。您只需要將ResultSet映射到列表,如答案中所示。 – BalusC 2010-09-17 20:08:10