我有一个带有IOT表的Oracle 10gR2数据库:create table countries (id number primary key, name varchar2(30) not null enable) organization index;我尝试使用此Java(版本1.6)代码更新表值:Statement stmt = con...
我有一个带有IOT表的Oracle 10gR2数据库:
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
HEAP示例AAAbgVAAJAAMyr8AAA
但我还是不知道如何解决这个问题.你有什么想法吗?
解决方法:
您是否可以获得查询的扩展SQL跟踪的结果,以了解JDBC在封面下的行为?我怀疑它正在尝试做
UPDATE COUNTRIES SET NAME =’__TEST__’WHERE ROWID =:rowid_fetched
和ROWID在Oracle IOT中意味着完全不同的东西;它不是行的不可变地址,而是对行的路径的猜测.
我关于如何执行此操作的建议是将系统生成的时间戳字段传播到所有表上,并将其用于并发控制,而不是声明可更新的记录集 – 这将记录记录集中每个记录的锁定.
然后您的应用程序将正常获取行集,但发出如下语句:
UPDATE COUNTRIES SET NAME =’__TEST__’WHERE MOD_TS =:mod_ts_fetched
给予无国籍乐观锁定.
本文标题为:java – 无法使用jbdc updateRow方法更新Oracle IOT表
- Java迭代器与Collection接口超详细讲解 2023-03-11
- Java8 Instant 时间戳实例讲解 2023-07-01
- jsp文件下载功能实现代码 2023-07-30
- JSP的request对象实例详解 2023-07-31
- 注意Java中 new BigDecimal(double val) 的使用 2023-03-15
- Java并发编程ThreadLocalRandom类详解 2022-12-27
- JSP Spring中Druid连接池配置详解 2023-08-01
- Java GUI图形界面开发实现小型计算器流程详解 2023-03-31
- 利用 SpringBoot 在 ES 中实现类似连表查询功能 2023-02-28
- 浅析Java进制转换、输入、命名问题 2023-03-22