ORA-00604: 递归 SQL 级别 1 发生错误

Posted

技术标签:

【中文标题】ORA-00604: 递归 SQL 级别 1 发生错误【英文标题】:ORA-00604: error occurred at recursive SQL level 1 【发布时间】:2012-08-23 01:51:16 【问题描述】:

我开始收到下面的SQL exception,但我不知道这个异常的根本原因是什么?我也将关闭dbconnectionprepared statement。那有什么问题呢?

java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded
ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded
ORA-01000: maximum open cursors exceeded

以下是我正在使用的代码。我的代码有什么问题吗?

for (Entry<Integer, LinkedHashMap<Integer, String>> entry : GUID_ID_MAPPING.entrySet()) 

    pstatement = db_connection.prepareStatement(PDSLnPConstants.UPSERT_SQL); // create a statement
    pstatement.setInt(1, entry.getKey());
    pstatement.setString(2, entry.getValue().get(PDSLnPConstants.CGUID_ID));
    pstatement.setString(3, entry.getValue().get(PDSLnPConstants.PGUID_ID));
    pstatement.setString(4, entry.getValue().get(PDSLnPConstants.SGUID_ID));
    pstatement.setString(5, entry.getValue().get(PDSLnPConstants.UID_ID));
    pstatement.setString(6, entry.getValue().get(PDSLnPConstants.ULOC_ID));
    pstatement.setString(7, entry.getValue().get(PDSLnPConstants.SLOC_ID));
    pstatement.setString(8, entry.getValue().get(PDSLnPConstants.PLOC_ID));
    pstatement.setString(9, entry.getValue().get(PDSLnPConstants.ALOC_ID));
    pstatement.setString(10, entry.getValue().get(PDSLnPConstants.SITE_ID));
    pstatement.executeUpdate();

    

 catch (SQLException e) 
    getLogger().log(LogLevel.ERROR, e);
 finally 
    if (pstatement!= null) 
    try 
        pstatement.close();
        pstatement = null;
     catch (SQLException e) 
        getLogger().log(LogLevel.ERROR, e.getMessage(), e.fillInStackTrace());
    
    
    if (db_connection!= null) 
    try 
        db_connection.close();
        db_connection = null;
     catch (SQLException e) 
        getLogger().log(LogLevel.ERROR, e.getMessage(), e.fillInStackTrace());
    
    

【问题讨论】:

【参考方案1】:

我认为PreparedStatement 的定义应该被拉出循环并通过调用clearParameters 在循环内重复使用:

pstatement = db_connection.prepareStatement(PDSLnPConstants.UPSERT_SQL); // create a statement

for (Entry<Integer, LinkedHashMap<Integer, String>> entry : GUID_ID_MAPPING.entrySet()) 

    pstatement.setInt(1, entry.getKey());
    pstatement.setString(2, entry.getValue().get(PDSLnPConstants.CGUID_ID));
    pstatement.setString(3, entry.getValue().get(PDSLnPConstants.PGUID_ID));
    pstatement.setString(4, entry.getValue().get(PDSLnPConstants.SGUID_ID));
    pstatement.setString(5, entry.getValue().get(PDSLnPConstants.UID_ID));
    pstatement.setString(6, entry.getValue().get(PDSLnPConstants.ULOC_ID));
    pstatement.setString(7, entry.getValue().get(PDSLnPConstants.SLOC_ID));
    pstatement.setString(8, entry.getValue().get(PDSLnPConstants.PLOC_ID));
    pstatement.setString(9, entry.getValue().get(PDSLnPConstants.ALOC_ID));
    pstatement.setString(10, entry.getValue().get(PDSLnPConstants.SITE_ID));
    pstatement.executeUpdate();

    pstatement.clearParameters();


您可能还想研究批处理 (addBatch)。如果您正在测试,您可能需要稍等片刻,以便清理现有的“打开”游标。

【讨论】:

【参考方案2】:

好吧,我想我给你一种解决方法,但无论如何很多人都会遇到这样的问题,所以我不妨分享一下。

我使用的是 NetBeans 7.3.1 并引用远程服务器上的 Oracle 数据库,因此我无法编辑注册表项,但我意识到我正在使用 ojdbc14.jar 并且我需要的只是ojdbc6.jar 在我的类路径中。

解决方法:使用 ojdbc6.jar 代替 ojdbc14.jar

【讨论】:

以上是关于ORA-00604: 递归 SQL 级别 1 发生错误的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 发生错误

ORA-00604。我创建连接池,我试图在glassfish中ping

java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01003: 语句未进行语法分析

oracle 表删除出错 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01426: 数字溢出

ORA-00604: 递归 SQL 级别 1 出现错误和ORA-00942: 表或视图不存在 一起出现怎么解决

jdbc 查询5万条数据出现 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数