给出以下功能:
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
答案 0 :(得分:1)
问题在于,当您指定CONCUR_UPDATABLE时,它将应用于函数调用本身的ResultSet - 如果存在,则不存在。您通过getObject()获取的ResultSet对象不是CallableStatement的ResultSet,因此默认情况下它不可更新。
我的第一个想法是在函数中向查询添加FOR UPDATE可能会使ResultSet更新,但没有运气。
我无法看到任何与JDBC通信的方式,在这种情况下结果集应该是可更新的。
答案 1 :(得分:1)
Ref cursors are not updatable.您必须直接执行查询,而不是使用存储过程或使用单独的JDBC语句执行更新。