无法从JDBC更新Oracle视图

无法从JDBC更新Oracle视图,jdbc,oracle11g,lotus-domino,Jdbc,Oracle11g,Lotus Domino,概述:需要从Oracle视图中读取行并创建Notes文档,保存文档,然后将文档唯一ID写回Oracle 我能够读取连接和读取数据没有问题。我正在使用连接到Oracle 11数据库的类型4连接。Oracle视图设置为允许更新。视图中没有此处概述的内容: *使用相同的用户名和密码,您可以通过键入SQL语句成功地更新视图 *尝试使用conn.setAutoCommit(false);这没有效果 *已验证结果集是可更新的(1008) *用户已被授予完全DBA访问权限(暂时) *我尝试了createSta

概述:需要从Oracle视图中读取行并创建Notes文档,保存文档,然后将文档唯一ID写回Oracle

我能够读取连接和读取数据没有问题。我正在使用连接到Oracle 11数据库的类型4连接。Oracle视图设置为允许更新。视图中没有此处概述的内容:

*使用相同的用户名和密码,您可以通过键入SQL语句成功地更新视图

*尝试使用conn.setAutoCommit(false);这没有效果

*已验证结果集是可更新的(1008)

*用户已被授予完全DBA访问权限(暂时)

*我尝试了createStatement方法中第一个参数的所有可能组合

...
Statement statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = statement.executeQuery(fetch);
...
String UNID = doc.getUniversalID(); //gets unique id from saved Notes Document  
System.out.println("This is what to write to Oracle:" + UNID);
System.out.println("is updatable=1008, not updatable=1007 value is:" + rs.getConcurrency());
System.out.println("is Result Set Closed:" + rs.isClosed());

rs.updateString("NOTES_DOC_ID", UNID);
System.out.println("got past updating NOTES_DOC_ID column");
rs.updateRow();  //fails here
以下是来自控制台的错误:

以下是要向Oracle写入的内容:BF8091259610C61B87257B1605C14FB

可更新=1008,不可更新=1007值为:1008

结果集是否关闭:false

已通过更新NOTES\u DOC\u ID列

java.security.AccessControlException:拒绝访问(java.lang.RuntimePermission exitVM.0)

在要求用户具有DBA访问权限之前,我将获得

java.sql.SQLSyntaxErrorException:ORA-01031:权限不足

我认为这是一个很大的线索。我的DBA不知道还能给我什么访问权限


DBA希望我开始使用ref游标,这很好,但我怀疑JDBC访问的某种安全设置让我感到困惑,我想先探讨一下。如果存在安全问题,那么我不认为改变我读取行的方式会有什么不同。关于如何做到这一点的大部分文档都是从Oracle的网站以及本网站获得的。

我将回答我的问题,并解释我是如何克服这一障碍的。最后,我基本上做到了“没有名字的马”的建议

我没有使用resultSet游标或ref游标来执行更新,而是能够使用普通的update语句。这是可能的,因为我能够说服DBA为唯一标识符创建一列。我们永远无法避免resultSet的updateRow()方法引起的异常。在他添加唯一标识符之前,没有一个密钥可以可靠地使用UPDATE语句

下面是代码,其中updateSQL是一个包含update SQL语句的字符串:

updateResultInt = updateStatement.executeUpdate(updateSQL);
如果成功,则返回1

需要注意的是,如果您使用TOra或sql plus之类的工具来检查更新语句,则必须记住手动提交它们。如果您不这样做,您的java代理在尝试运行它时将挂起。以下是一个很好的参考资料,帮助我解决了这个问题:


感谢那些评论的人

为什么不简单地使用一个“普通”的UPDATE语句呢?我从来并没有看到可更新的结果集在任何数据库中都能正常工作。由于数据的性质,这并不是一个真正的选项。需要使用游标。如果您尝试直接在sql中更新视图,例如使用sql*plus,它是否有效?IMHO,授予DBA权限并不是有史以来最明智的想法。我没有亲自这么做,但DBA说他可以使用TOra进行更新。它似乎只在JDBC中失败。我们昨天尝试创建一个访问控制列表,并允许从我的ip地址进行所有访问,但没有任何效果。DBA访问只是临时的,只是为了排除用户访问问题。问题:DBA将默认端口1521重命名为其他端口,这会导致问题吗。