java - 无法使用 jbdc updateRow 方法更新 Oracle IOT 表

标签 java oracle jdbc

我有 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/

相关文章:

java - 安卓虚拟设备 : Accessing NanoHTTPD from hostsystem

java - 关于 checkstyle SUN 约定的派生异常的最简单的 javadoc 文档?

java - JSP 在我 friend 的电脑上运行时返回 Jasper 异常

sql - Oracle exp 函数数值溢出错误

Java JDBC数据库连接登录

java - 如何修复 : "Parameter index out of range (2 > number of parameters, which is 1)."

Java method()++ VS method()+1

java - ORA-01830 : date format picture ends before converting entire input string - JAVA/Oracle

sql - ORA-01791 : not a SELECTed expression PL SQL

java - 32位Win7、32位JDK和32位MS Access导致java.sql.SQLException : No suitable driver found