鉴于以下功能:我可以更新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。
谢谢,罗布
谢谢,但是一旦我这样做,我会在rs.next()调用中出现错误“取出序列”。我需要在存储过程中执行其他操作吗? – 2009-10-07 16:11:41
如果您添加FOR UPDATE,那么您需要关闭自动提交 - 您无法在提取之间进行提交。但在我的测试中,添加FOR UPDATE并没有帮助。 – 2009-10-07 19:20:39
这很有道理,非常感谢您的努力。 – 2009-10-08 08:35:19