Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t使用jbdc updateRow方法更新Oracle IOT表_Java_Oracle_Jdbc - Fatal编程技术网

Java Can';t使用jbdc updateRow方法更新Oracle IOT表

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驱

我有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驱动程序(从这里开始)

经过一些研究,我发现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();