【问题标题】:Getting an exception ORA-00942: table or view does not exist - when inserting into an existing table获取异常 ORA-00942: 表或视图不存在 - 插入现有表时
【发布时间】:2011-09-27 13:07:03
【问题描述】:

尝试将一批行插入现有表时,我遇到了异常

ORA-00942: 表或视图不存在

我可以确认该表存在于 db 中,我可以使用 oracle 将数据插入该表 sql开发者。但是当我尝试在java中使用preparedstatement插入行时,它的抛出表不存在错误。

请在下面找到错误的堆栈跟踪

java.sql.SQLException: ORA-00942: table or view does not exist

    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) 
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573) 
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1889)
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout>>(OracleStatement.java:2709)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
    at quotecopy.DbConnection.insertIntoDestinationDb(DbConnection.java:591)
    at quotecopy.QuoteCopier.main(QuoteCopier.java:72) 

谁能提出这个错误的原因?

更新:问题已解决

我的数据库连接属性或我的表或视图名称没有问题。问题的解决方法很奇怪。我尝试插入的列之一是 Clob 类型。由于我之前在 oracle db 中处理 clob 数据时遇到了很多麻烦,因此尝试用临时字符串设置器替换 clob 设置器,并且执行相同的代码没有任何问题,并且所有行都正确插入!!!。

即。 peparedstatement.setClob(columnIndex, clob)

被替换为

peparedstatement.setString(columnIndex, "String")

为什么错误表或视图确实存在错误是由于插入 clob 数据时出错而引发的。谁能解释一下?

非常感谢您的回答和 cmets。

【问题讨论】:

  • 好吧,我想“表或视图不存在”。你能告诉我们表格定义和你的陈述吗?
  • @aquero:打印(并在此处显示)产生此错误的查询可能会有所帮助。
  • @aquero:请向我们展示您正在使用的 Java 代码。
  • 对于 oracle 中的 [BC]Lob,我认为您必须先插入带有 null Lob 的新记录,然后直接使用 Lob 数据对其进行更新。 (已经有一段时间了,所以我不完全确定>)
  • @rsp - 对于非常旧版本的数据库来说确实如此。我想 JDBC 调用可能仍然如此。

标签: java sql oracle jdbc ora-00942


【解决方案1】:

如果表存在,Oracle 也会报告此错误,但您没有任何权限。因此,如果您确定该表在那里,请检查授权。

【讨论】:

  • 这正是我在需要访问(也用于 SELECT)其他模式的多用户应用程序上的情况。给开发人员的提示:重新检查此问题是否有可能添加的新表,因为很容易忘记(就是我)
【解决方案2】:

当目标表确实存在并且具有正确的特权时,在某些情况下,setCLOB() 似乎存在一些问题会导致 ORA-00942。我现在遇到了这个确切的问题,我可以通过简单地不将 CLOB 绑定到同一个表中来使 ORA-00942 消失。

我尝试了 setClob() 与 java.sql.Clob 和 setCLOB() 与 oracle.jdbc.CLOB 但结果相同。

正如您所说,如果您将其绑定为字符串,问题就会消失 - 但这会将您的数据大小限制为 4k。

从测试来看,它似乎是在绑定 CLOB 之前在会话上打开事务时触发的。解决这个问题后我会反馈...检查 Oracle 支持。

【讨论】:

    【解决方案3】:

    我的数据库连接属性或我的表或视图名称没有问题。问题的解决方法很奇怪。我尝试插入的列之一是 Clob 类型。由于我之前在 oracle db 中处理 clob 数据时遇到了很多麻烦,因此尝试用临时字符串设置器替换 clob 设置器,并且执行相同的代码没有任何问题,并且所有行都正确插入!!!。

    即。 peparedstatement.setClob(columnIndex, clob)

    被替换为

    peparedstatement.setString(columnIndex, "String")

    【讨论】:

    • 这不是一个合适的解决方案!如果您尝试在数据库之间传输帐户数据,那么您将丢失这些列中可用的 clob、blob 数据。
    【解决方案4】:

    @unbeli 是对的。在表上没有适当的授权将导致此错误。对于它的价值,我最近经历了这一点。我遇到了您描述的确切问题,我可以通过 sql developer 执行插入语句,但使用休眠时会失败。我终于意识到我的代码所做的不仅仅是明显的插入。插入到没有适当授权的其他表中。调整授予权限为我解决了这个问题。

    注意:不要有评论的声誉,否则这可能是评论。

    【讨论】:

    • 这对我来说是一个答案,因为它是一般情况(也适用于 SELECT)。这正是我在需要访问(也用于 SELECT)其他模式的多用户应用程序上的情况。给开发人员的提示:重新检查此问题是否有可能添加的新表,因为很容易忘记(就是我)
    【解决方案5】:

    我们在 BLOB 列上遇到了这个问题。以防万一其他人在遇到此错误时遇到此问题,以下是我们解决问题的方法:

    我们从这个开始:

                preparedStatement.setBlob(parameterIndex, resultSet.getBlob(columnName)); break;
    

    我们通过将该行更改为以下内容解决了该问题:

            java.sql.Blob blob = resultSet.getBlob(columnName);
            if (blob != null) {
                java.io.InputStream blobData =  blob.getBinaryStream();
                preparedStatement.setBinaryStream(parameterIndex, blobData);
            } else {
                preparedStatement.setBinaryStream(parameterIndex, null);
            }
    

    【讨论】:

      【解决方案6】:

      我找到了如何在不使用 JDBC 将数据限制为 4K 的 setString() 方法的情况下解决此问题。

      你需要做的是使用preparedStatement.setClob(int parameterIndex, Reader reader)。至少这对我有用。认为Oracle驱动程序将数据转换为字符流以插入,似乎不是。或某些特定的导致错误的东西。

      使用 characterStream 似乎对我有用。我正在从一个数据库读取表并使用 jdbc 写入另一个数据库。就像上面提到的那样,我得到了 table not found 错误。所以这就是我解决问题的方法:

      case Types.CLOB:   //Using a switch statement for all columns, this is for CLOB columns
              Clob clobData = resultSet.getClob(columnIndex); // The source db
              if (clobData != null) {
                  preparedStatement.setClob(columnIndex, clobData.getCharacterStream());
              } else {
                  preparedStatement.setClob(columnIndex, clobData);
              }
              clobData = null;
              return;
      

      现在一切都好。

      【讨论】:

        【解决方案7】:

        您的脚本是否提供了模式名称,还是依赖登录到数据库的用户来选择默认模式

        可能是您没有命名架构,并且您使用系统用户而不是架构用户执行批处理,导致脚本的执行上下文错误,如果由具有目标的用户执行,该脚本将正常工作架构设置为默认架构。您最好的做法是在插入语句中包含架构名称:

        INSERT INTO myschema.mytable (mycolums) VALUES ('myvalue')
        

        更新:您是否尝试在准备好的语句中将表名绑定为绑定值?那是行不通的。

        【讨论】:

        • 我更改了插入查询以包含架构,但仍然得到相同的异常
        • @aquero,您能否编辑您的问题并包含准备、绑定值和执行的语句和 Java 代码?
        • 请找到上面我的问题中添加的 cmets,插入 clob 数据时出现问题。但是抛出的异常是表不存在错误。非常感谢您的帮助..:)
        【解决方案8】:

        它对我有用:

        Clob clob1;
        while (rs.next()) {
           rs.setString(1, rs.getString("FIELD_1"));
        
           clob1 = rs.getClob("CLOB1");
           if (clob1 != null) {
              sta.setClob(2, clob1.getCharacterStream());
           } else {
              sta.setClob(2, clob1);
           }
           clob1 = null;
        
           sta.setString(3, rs.getString("FIELD_3"));
        }
        

        【讨论】:

          【解决方案9】:

          您是否有可能为VARCHAR 执行INSERT,但为CLOB 执行INSERT 然后为UPDATE

          如果是这样,除了INSERT 之外,您还需要授予UPDATE 对表的权限。

          https://stackoverflow.com/a/64352414/1089967

          【讨论】:

            【解决方案10】:

            在这里,我得到了问题的解决方案。如果你使用它,问题就出在玻璃鱼身上。创建 JNDI 名称时,请确保池名称正确,并且池名称是您创建的连接池名称。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-01-22
              • 1970-01-01
              • 2015-11-09
              • 2011-12-10
              • 2015-01-30
              • 2016-08-23
              相关资源
              最近更新 更多