1

我已经连接到 Oracle 数据库。现在我面临

ORA-01000: maximum open cursors exceeded

我使用代码插入数据:

public static void OracleJDBC(String Serial_Number, String Charged_MDN) {

     String dataInsertQuery = "insert into CDR_Huawei (Serial_Number, Charged_MDN) values ('" + Serial_Number + "', '" + Charged_MDN + "')";
     String dataSelectQuery = "select * from CDR_Huawei";
     Statement statement = null;

    try {
    statement = connection.createStatement();
    statement.execute(dataInsertQuery);
    //System.out.println("Data Inserted Successfully");

    } catch (SQLException e) {
            e.printStackTrace();
    }
   }

它仅适用于前 500 条记录,然后出现错误 Ora-1000。我总共有大约 6000 条记录。我发现一些主题说应该更改配置,但我无法更改配置。

还有其他方法可以解决此错误吗?

4

3 回答 3

3

finally在一个块中关闭您的语句。

try {
    statement = connection.createStatement();
    statement.execute(dataInsertQuery);
} catch (SQLException e) {
        e.printStackTrace();
} finally {
    if (statement != null) statement.close();
}
于 2013-10-04T09:54:55.553 回答
1

每次编写时都会生成新的语句对象 statement = connection.createStatement()

使用后关闭语句是一种好习惯...

 statement.close(); after `statement.execute(dataInsertQuery);`

将解决您的问题。

于 2013-10-04T09:56:28.930 回答
0

提请注意 ppeterka 评论的额外答案:

你真的应该在这里使用 PreparedStatements。原因是您当前正在向数据库发送 6000 个唯一的 SQL 插入语句。这些语句是唯一的,因为插入语句的值粘在您的语句文本中。数据库必须解析每个唯一语句并将其放入共享池中以供重用。但它不会重复使用,因为它们是独一无二的。

使用在值中绑定的 PreparedStatements,您将只创建一个唯一的 SQL 插入语句,它只需要解析一次并且不会使共享池混乱。您的数据库管理员将为此感谢您。

于 2013-10-04T12:40:36.100 回答