【问题标题】:Can I update the result (sys_refcursor) of an Oracle stored procedure (in Java)?我可以更新 Oracle 存储过程(Java 中)的结果(sys_refcursor)吗?
【发布时间】:2009-10-07 10:57:37
【问题描述】:

给定以下函数:

create or replace FUNCTION "GETADDRESSES"
    RETURN sys_refcursor
IS
    address_cursor sys_refcursor;
BEGIN
    OPEN address_cursor FOR 
        SELECT * FROM Address;
    RETURN address_cursor;
END;

我希望能够在 Java 中对此结果集进行更改并将更改发布回数据库。它在 Java 中调用如下:

        String genericQuery = "{ call ? := getAddresses() }";
        CallableStatement stmt = connection.prepareCall(genericQuery, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

       stmt.registerOutParameter(1, OracleTypes.CURSOR);
       stmt.execute();
       ResultSet rs = (ResultSet)stmt.getObject(1);
       while (rs.next())
       {
           System.out.println (rs.getString(2)); 
           rs.updateString(2, "*" + rs.getString(2));
       }
       stmt.close();

引发异常“只读结果集的无效操作”。有没有办法将此游标作为可以更新并从 Java 发布回数据库的东西返回?我正在使用 Oracle 10g。

谢谢,罗伯

【问题讨论】:

    标签: java oracle stored-procedures


    【解决方案1】:

    问题在于,当您指定 CONCUR_UPDATABLE 时,它适用于函数调用本身的 ResultSet——如果有,则没有。您通过 getObject() 获得的 ResultSet 对象不是 CallableStatement 的 ResultSet,因此默认情况下它是不可更新的。

    我的第一个想法是在函数中的查询中添加 FOR UPDATE 可能会使 ResultSet 可更新,但没有运气。

    在这种情况下,我看不到任何与 JDBC 沟通结果集应该是可更新的方式。

    【讨论】:

    • 谢谢,但是一旦我这样做了,我就会在 rs.next() 调用中收到错误“提取顺序错误”。我必须在存储过程中做其他事情吗?
    • 如果你添加 FOR UPDATE,那么你需要关闭自动提交——你不能在两次获取之间提交。但在我的测试中,添加 FOR UPDATE 并没有帮助。
    【解决方案2】:

    Ref cursors are not updatable. 您必须直接执行查询而不是使用存储过程,或者使用单独的 JDBC 语句执行更新。

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 2017-08-18
      • 2010-10-12
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多