Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以更新Oracle存储过程(Java)的结果(sys_refcursor)吗?_Java_Oracle_Stored Procedures - Fatal编程技术网

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

我可以更新Oracle存储过程(Java)的结果(sys_refcursor)吗?,java,oracle,stored-procedures,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中

鉴于以下功能:

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更新并发布回db的东西返回?我正在使用Oracle 10g


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

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


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

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

谢谢,但一旦我这样做,我就会在rs.next()调用上出现错误“fetch out of sequence”。我是否必须在存储过程中执行其他操作?如果添加以进行更新,则需要关闭“自动提交”--不能在两次回迁之间提交。但是在我的测试中,添加FOR UPDATE没有任何帮助。