2009-10-07 39 views
2

鉴于以下功能:我可以更新Oracle存储过程(Java中的)的结果(sys_refcursor)吗?

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。

谢谢,罗布

回答

1

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

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

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

+0

谢谢,但是一旦我这样做,我会在rs.next()调用中出现错误“取出序列”。我需要在存储过程中执行其他操作吗? – 2009-10-07 16:11:41

+0

如果您添加FOR UPDATE,那么您需要关闭自动提交 - 您无法在提取之间进行提交。但在我的测试中,添加FOR UPDATE并没有帮助。 – 2009-10-07 19:20:39

+0

这很有道理,非常感谢您的努力。 – 2009-10-08 08:35:19

相关问题