我有 Oracle 10gR2 数据库,其中包含 IOT 表:
create table countries (
id number primary key,
name varchar2(30) not null enable
) organization index;
我尝试使用此 Java(1.6 版)代码更新表值:
Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE);
ResultSet src = stmt.executeQuery("select id, name from countries");
src.next();
src.updateString("name", "__test__");
src.updateRow();
但是 updateRow 抛出 SQLException(ORA-01410:无效的 ROWID)。如果我尝试更新堆(普通)表 - 一切正常。
我已经将此代码与不同版本的 oracle 驱动程序一起使用(来自此处 http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_10201.html)
经过一些研究,我发现 IOT 和 HEAP 表的 rowid 格式不同:
物联网示例 *BAJzKgwCwRb+
堆示例 AAAbgVAAJAAMyr8AAA
但是我还是不知道怎么解决这个问题。你有什么想法吗?
最佳答案
您能否获得查询的扩展 SQL 跟踪的结果以查看 JDBC 在幕后执行的操作?我怀疑它正在尝试做
更新国家 SET NAME = '__TEST__' WHERE ROWID = :rowid_fetched
而 ROWID 在 Oracle IOT 中意味着完全不同的东西;它不是行的不可变地址,而是对该行路径的猜测。
关于如何做到这一点,我的建议是将系统生成的时间戳字段传播到您的所有表,并将其用于并发控制,而不是声明可更新的记录集——它将为中的每条记录获取并保持锁定记录集。
然后您的应用程序将正常获取行集,但发出如下语句:
更新国家 SET NAME = '__TEST__' WHERE MOD_TS = :mod_ts_fetched
提供无状态乐观锁定。
关于java - 无法使用 jbdc updateRow 方法更新 Oracle IOT 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2363684/