给定以下函数:
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/