JDBC中ResultSet的修改

本文主要探讨JDBC的ResultSet对象直接更新结果集的情况。以oracle9i数据库为例,使用不同SQL语句进行尝试,发现单表、非虚列、非通配符的statement可被修改,其他则不行,最后还提及jdk文档中与ResultSet相关的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC的ResultSet对象,一般用法中update和select是由独立的Statement来完成。

尝试了一下直接update结果集。数据库oracle9i,驱动classes12.jar

Connection con = ds.buildConnection();

PreparedStatement smt = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
           
            ResultSet rs = smt.executeQuery();
            while(rs.next()){
                rs.updateString("name","test"); rs.updateRow();
            }

分别使用不同的sql:

String sql = "select a.name,b.id from user a,user_employee b where a.id = b.user_id";

这样的做法会抛出异常,rs这个时候是只读的。

String sql = "select a.name from user a";

单表操作的时候没有问题。

String sql = "select * from user"

用*的方式有问题,rs只读。

再尝试一种方式:

String sql = "select id+id1 mycol,name from user";

修改一下update语句:

rs.updateInt("aa",1);

这个时候,rs仍然保持是updatable,但是这句话却会引起一个异常:

java.sql.SQLException: ORA-01733: 此处不允许虚拟列


 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

 at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)

  。。。。。。

当然这一列通过dbmeta来获取也是readonly的。

总结一下,基本上,是单表的,非虚列,非通配符的statement可以被修改,而其他则不行。

只在jdk文档中找到了一段话是和ResultSet相关的:

A default ResultSet object is not updatable and has a cursor that moves forward only. Thus, you can iterate through it only once and only from the first row to the last row. It is possible to produce ResultSet objects that are scrollable and/or updatable. The following code fragment, in which con is a valid Connection object, illustrates how to make a result set that is scrollable and insensitive to updates by others, and that is updatable. See ResultSet fields for other options.

       Statement stmt = con.createStatement(
                                      ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
       ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
       // rs will be scrollable, will not show changes made by others,
       // and will be updatable
没有找到更加具体全面的说明,有篇文章
(http://www.zhuoda.org/blog3/article.jsp?blogid=1681&id=1833)说DB2 Everyplace不支
持CONCUR_UPDATABLE类型的结果集,还有很早以前用sybase的时候,sybase的游标类型支持也是有些
问题的,不知道哪里能找到相关方面的比较全面的文章,有谁知道,希望留在我的blog上,先谢了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值