Java 获取异常ORA-00942:表或视图不存在-插入现有表时

Java 获取异常ORA-00942:表或视图不存在-插入现有表时,java,sql,oracle,jdbc,ora-00942,Java,Sql,Oracle,Jdbc,Ora 00942,在尝试向现有表插入一批行时,出现以下异常 ORA-00942:表或视图不存在 我可以确认该表存在于数据库中,并且可以使用oracle向该表插入数据 sql开发人员。但当我尝试在java中使用preparedstatement插入行时,它的抛出表不存在错误 请在下面找到错误的堆栈跟踪 java.sql.SQLException: ORA-00942: table or view does not exist at oracle.jdbc.dbaccess.DBError.throwSql

在尝试向现有表插入一批行时,出现以下异常

ORA-00942:表或视图不存在

我可以确认该表存在于数据库中,并且可以使用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.setClobcolumnIndex,clob

被替换为

peparedstatement.SetString列索引,字符串

插入clob数据时出错,引发了错误表或视图存在的原因错误。你们谁能解释一下吗


非常感谢您的回答和评论。

您的脚本是提供架构名称,还是依赖登录数据库的用户选择默认架构

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

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

更新:您是否尝试在准备好的语句中将表名绑定为绑定值?如果表存在,但您没有任何权限,Oracle也会报告此错误。因此,如果您确定该表在那里,请检查授权。

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

我用java.sql.Clob尝试过setClob,用oracle.jdbc.Clob尝试过setClob,但结果相同

正如您所说的,如果您将数据绑定为字符串,那么问题就不会出现了——但这会将您的数据大小限制为4k


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

@unbeli是正确的。表上没有适当的授权将导致此错误。值得一提的是,我最近经历了这种情况。我遇到了您描述的问题,我可以通过sql developer执行insert语句,但在使用hibernate时会失败。我终于意识到我的代码所做的不仅仅是显而易见的插入。插入到其他没有适当授权的表中。调整授予特权为我解决了这个问题


注意:不要发表评论,否则这可能是评论。

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

即peparedstatement.setClobcolumnIndex,clob

被替换为

peparedstatement.SetString列索引,字符串


我发现了如何在不使用JDBC的setString方法的情况下解决这个问题,该方法将数据限制为4K

您需要做的是使用preparedStatement.setClobint parameterIndex,Reader。至少这对我来说是有效的。虽然Oracle驱动程序将数据转换为字符流以进行插入,但似乎并非如此。或者导致错误的特定内容

使用characterStream似乎适合我。我正在从一个数据库读取表,并使用jdbc向另一个数据库写入表。我得到了表未找到的错误,就像上面提到的一样。这就是我解决问题的方法:

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;

现在一切都好了。

我们在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);
        }
这对我很有用:

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"));
}

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


您是否可能正在为VARCHAR执行INSERT,但在为CLOB执行INSERT之后又进行更新

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


好吧,我想表或视图不存在。你能给我们看一下表定义和你的语句吗?@aquero:也许在这里打印和显示产生此错误的查询会有所帮助。@aquero:请给我们看一下你正在使用的Java代码。对于oracle中的[BC]Lob,我想你必须先插入一个带有空Lob的新记录,然后直接用Lob数据更新它。已经有一段时间了,所以我不能完全确定>@rsp-对于非常旧的数据库版本来说是这样的。我想JDBC调用可能仍然如此,我更改了insert查询以包含模式,但仍然得到相同的结果exception@aquero,您是否可以编辑您的问题,并包括准备、绑定值和执行的语句和Java代码?请查找上面我的问题中添加的注释,在插入clob数据时出现了问题。但引发的异常是表不存在错误。非常感谢你的帮助这不是一个合适的解决方案!如果您尝试在数据库之间传输帐户数据,则将丢失这些列中可用的clob、blob数据。这正是我在多用户应用程序上的情况,该应用程序还需要访问SELECT to other schema。开发人员的一个提示:重新检查这个问题,寻找您可能添加的新表,因为我很容易忘记这是一个答案,因为这也是SELECT的一般情况。这正是我在一个多用户应用程序上的情况,该应用程序还需要访问SELECT-to-other模式。给开发人员的一个提示:重新检查这个问题,寻找您可能添加的新表,因为很容易忘记这就是我