Java Can';t使用jbdc updateRow方法更新Oracle IOT表
我有Oracle 10gR2数据库,其中包含物联网表:Java Can';t使用jbdc updateRow方法更新Oracle IOT表,java,oracle,jdbc,Java,Oracle,Jdbc,我有Oracle 10gR2数据库,其中包含物联网表: create table countries ( id number primary key, name varchar2(30) not null enable ) organization index; 我尝试使用以下Java(1.6版)代码更新表值: 但是updateRow抛出SQLException(ORA-01410:无效的ROWID)。如果我试图更新一个堆(普通)表-所有的工作 我已经将此代码用于不同版本的oracle驱
create table countries (
id number primary key,
name varchar2(30) not null enable
) organization index;
我尝试使用以下Java(1.6版)代码更新表值:
但是updateRow抛出SQLException(ORA-01410:无效的ROWID)。如果我试图更新一个堆(普通)表-所有的工作
我已经将此代码用于不同版本的oracle驱动程序(从这里开始)
经过一些研究,我发现IOT和HEAP表具有不同的rowid格式:
物联网示例*BAJzKgwCwRb+
堆示例AAAbgVAAJAAMyr8AAA
但我仍然不知道如何解决这个问题。您有什么想法吗?您能获得查询的扩展SQL跟踪结果,看看JDBC在幕后做了什么吗?我怀疑它正试图这样做
UPDATE COUNTRIES SET NAME='\uuuuuu TEST\uuuuuuuu'其中ROWID=:ROWID\u获取
ROWID在Oracle IOT中的含义完全不同;这不是一行的不可变地址,而是对该行路径的猜测
关于如何做到这一点,我的建议是将系统生成的时间戳字段传播到所有表中,并将其用于并发控制,而不是声明一个可更新的记录集——它将为记录集中的每个记录获取并保持锁
然后,应用程序将正常获取行集,但会发出如下语句:
UPDATE COUNTRIES SET NAME='\uuuuuu TEST\uuuuuuu'其中MOD\u TS=:MOD\u TS\u fetched
提供无状态乐观锁定。看起来您的表实际上不需要进行IOT。我建议您将其重新创建为普通表,并在ID和名称上添加索引。相同的性能,相同的逻辑,没有ROWID问题。谢谢您的解决方案,但我想了解为什么它不起作用。这是一个bug或实现限制还是我的错误。我没有使用Java,但可能有一个设置可以在“按ROWID更新”和“按主键更新”或类似的设置之间切换。跟踪是个好主意!谢谢关于你的变通方案:谢谢,但我不需要变通方案,我想知道为什么它不可行。这是一个bug或实现限制还是我的错误。
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();