无法从JDBC更新Oracle视图

时间:2013-02-18 17:18:54

标签: jdbc oracle11g lotus-domino

概述:需要从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的网站以及本网站获得的。

1 个答案:

答案 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

感谢那些评论的人!