0
我有使用Java 6和ojdbc14.jar的連接到我的Oracle數據庫和嘗試使用下面的代碼來獲得序列ID java代碼寫的:ora-00604:在遞歸SQL級別1時發生錯誤?
long lNewAuditId = 0;
Statement stmt = null;
ResultSet result = null;
try {
stmt = argConnection.createStatement();
result = stmt.executeQuery(SQL_NEXT_AUDIT_ID);
if (!result.next())
throw new DAOException("Error obtaining new Audit Id - no result");
lNewAuditId = result.getLong(1);
m_logger.debug("Next Audit Id: " + lNewAuditId);
}
catch (SQLException sqle)
{
throw new DAOException("Error getting next Audit id", sqle);
}
finally
{
// do not close the connection here
close(result);
close(stmt);
}
我希望我正確關閉語句。雖然運行此代碼,我對着下面的問題:
java.sql.SQLException: ORA-01000: maximum open cursors exceeded
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:957)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1062)
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:841)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1134)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1274)
你不顯示你的說法,你的'接近()'方法,實際的地方,你的例外是生成,所以很難給出答案。然而你的代碼看起來很無辜。我會列出數據庫中的遊標。也可以是驅動程序錯誤(例如,DB元數據的getTables在12.1.0.2驅動程序中有遊標泄漏)。 – eckes
您的查詢生成一些遞歸調用。此外,在日誌中,我們看到一個在代碼中調用executeQuery()時調用的executeUpdate()方法。爲什麼?也許你的查詢可以解釋這一點。所以,你應該顯示查詢和整個**堆棧跟蹤。 – davidxxx
我在這裏添加了正確的日誌。我的close方法是通過調用stmt.close()來關閉stmt。我的數據庫是Oracle 12c和Java版本1.6,並使用ojdbc14.jar。 –