0

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

我能够读取连接并读取数据没有问题。我正在使用连接到 Oracle 11 数据库的类型 4 连接。Oracle 视图设置为允许更新。该视图中没有此处概述的内容:在 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 的内容:BF8091259610C61B87257B16005C14FB

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

结果集是否已关闭:false

过去更新 NOTES_DOC_ID 列

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

在要求用户拥有 DBA 访问权限之前,我会得到一个

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

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

DBA 希望我开始使用 ref 游标,这很好,但我怀疑 JDBC 访问的某种安全设置让我感到困惑,我想先探索一下。如果存在安全问题,那么我认为改变读取行的方式不会产生影响。大多数有关如何执行此操作的文档均来自 Oracle 的网站以及此站点。

4

1 回答 1

0

我将回答我的问题并解释我是如何克服这个障碍的。最后,我基本上按照“a_horse_with_no_name”的建议做了。

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

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

updateResultInt = updateStatement.executeUpdate(updateSQL);

如果成功则返回 1。

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

感谢评论的人!

于 2013-02-19T23:53:50.753 回答