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

时间:2009-10-07 10:57:37

标签: 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。

谢谢,Rob

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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