概述:需要从Oracle视图中读取行并创建Notes文档,保存文档,然后将Document Unique ID写回Oracle。
我能够读取连接和读取数据没问题。我正在使用连接到Oracle 11数据库的类型4连接。 Oracle视图设置为允许更新。该视图中没有任何内容可以概括为:In Oracle, is it possible to INSERT or UPDATE a record through a view?
*使用相同的用户名和密码,您可以通过键入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的网站以及本网站获得的。
答案 0 :(得分:0)
我将回答我的问题并解释我是如何克服这个障碍的。最后,我基本上做了'a_horse_with_no_name'的建议。
我可以使用普通的UPDATE语句,而不是使用resultSet游标或引用游标来执行更新。这是可能的,因为我能够说服DBA为唯一标识符创建列。我们永远无法解决由resultSet的updateRow()方法引起的异常。在添加唯一标识符之前,没有可靠地使用UPDATE语句的密钥。
以下是updateSQL是包含更新SQL语句的字符串的代码:
updateResultInt = updateStatement.executeUpdate(updateSQL);
如果成功则返回1。
提醒一句,如果您使用TOra或sql plus等工具来检查更新语句,则必须记住手动提交它们。如果你不这样做,你的java代理将在尝试运行它时挂起。这是一个很好的参考资料,帮助我解决了这个问题:SQL Update hangs Java program
感谢那些评论的人!