java - 我可以更新 Oracle 存储过程(Java 中)的结果 (sys_refcursor) 吗?

标签 java oracle stored-procedures

给定以下函数:

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。

谢谢罗布

最佳答案

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

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

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

关于java - 我可以更新 Oracle 存储过程(Java 中)的结果 (sys_refcursor) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1530911/

相关文章:

oracle - 将多种日期格式转换为单个格式化日期

java 获取插入的行ID

mysql - 使用存储过程选择查询

sql - 如何在存储过程中传递列表作为参数?

java - 如何处理2个具有相同类名的iframe

java - Android Volley - POST 参数未到达 PHP 脚本

java - 如何处理被拒绝的权限 Android M (EasyPermissions)

java - 安全随机 : thread safe without contention and still cryptographically secure?

java - 通过 wsdl 传入最大大小为 2^256 的数字

oracle - 动态设置 Oracle 序列的 "Start With"值