繁体   English   中英

Oracle PL / SQL存储过程中的JDBC结果集

[英]JDBC result set from an Oracle PL/SQL stored procedure

oracleClose()和oracleCloseQuery()在sqlj.runtime.ExecutionContext.OracleContext中做什么。

由于我们在finally块中使用oracleClose()将jdbc驱动程序jar升级到ojdbc5.jar ,因此,当使用resultset.next()而不是oracleCloseQuery()时,会出现以下异常。 使用oracleCloseQuery()是否安全? 该数据库是Oracle 11g和WAS 6.1.XX,感谢您的答复。 这是错误消息:

java.sql.SQLException:已关闭语​​句:下一步位于oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:131)处的oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)中的.DatabaseError.throwSqlException(DatabaseError.java:197)oracle.jdbc中的oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:269)中的。 com.westgroup.pubsvc.rms.models.ResultSetSRC.getNextResult(ResultSetSRC.java:112)上的driver.OracleResultSetImpl.next(OracleResultSetImpl.java:205)

唯一的例外是告诉你该Statement已返回此ResultSet ,当你试图遍历是被关闭ResultSet 这表示您正在执行Statementtry之外使用ResultSet ,并且您可能使用ResultSet作为方法的返回值。 这是一个坏习惯

我建议您重写JDBC代码,以便在执行Statement同一try块中处理ResultSet ,或者该方法返回类似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代码在数据库之间可移植。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM