概述:需要从Oracle视图读取行并创建Notes文档,保存文档,然后将文档唯一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 是updatable=1008,而不是updatable=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的网站以及这个站点获得的。
发布于 2013-02-19 23:53:50
我将回答我的问题并解释我是如何越过这个路障的。最后,我基本上做了'a_horse_with_no_name‘的建议。
我没有使用resultSet游标或参考游标来执行更新,而是能够使用简单的update语句。这是可能的,因为我能够说服DBA为唯一标识符创建列。我们永远无法避免由updateRow()方法引起的resultSet异常。在他添加唯一标识符之前,没有一个键可以可靠地使用UPDATE语句。
下面是updateSQL是保存updateSQL语句的字符串的代码:
updateResultInt = updateStatement.executeUpdate(updateSQL);
如果成功,它将返回一个1。
请注意,如果您使用TOra或sql之类的工具来检查update语句,则必须记住手动提交它们。如果您不这样做,您的java代理在尝试运行它时会挂起。这里有一个很好的参考资料,帮助我解决这个问题:SQL Update hangs Java program
感谢那些发表评论的人!
https://stackoverflow.com/questions/14941785
复制相似问题