我有一个带有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实现生成PDF文件 2023-06-10
- 使用Spring Boot的原因解析 2023-02-19
- JSP导出Excel文件的方法 2023-08-02
- 使用Java Service Wrapper将java程序作为linux服务并且开机自动启动 2023-09-01
- synchronized背后的monitor锁实现详解 2023-05-14
- SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置 2023-01-13
- Java获取字符串编码格式实现思路 2023-05-25
- Java DirectByteBuffer堆外内存回收详解 2023-06-06
- SpringBoot实现在webapp下直接访问html,jsp 2023-06-30
- Spring Data Exists查询最佳方法编写示例 2023-03-22