15

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

ORA-00942: 表或视图不存在

我可以确认该表存在于 db 中,并且可以使用 oracle sql developer 将数据插入到该表中。但是当我尝试在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 设置器,并且执行相同的代码没有任何问题,并且所有行都正确插入!!!。

IE。peparedstatement.setClob(columnIndex, clob)

被替换为

peparedstatement.setString(columnIndex, "String")

为什么错误表或视图确实存在错误是由于插入 clob 数据时出错而引发的。你们中的任何人都可以解释一下吗?

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

4

10 回答 10

14

如果表存在,Oracle 也会报这个错误,但是你没有任何权限。因此,如果您确定该表在那里,请检查赠款。

于 2011-07-03T08:35:41.323 回答
10

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

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

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

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

于 2011-07-12T13:51:52.063 回答
7

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

IE。peparedstatement.setClob(columnIndex, clob)

被替换为

peparedstatement.setString(columnIndex, "String")

于 2011-07-19T08:40:27.243 回答
4

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

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

于 2011-07-18T12:45:17.553 回答
3

我们在 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);
        }
于 2014-07-14T17:47:14.920 回答
2

我找到了如何在不使用将数据限制为 4K 的 JDBC 的 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;

现在一切都好。

于 2012-03-15T15:56:26.133 回答
1

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

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

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

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

于 2011-07-03T08:00:48.303 回答
0

这个对我有用:

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"));
}
于 2015-06-12T16:04:27.000 回答
0

您是否有可能正在做INSERTforVARCHAR但做 an INSERTthen an UPDATEfor CLOB

如果是这样,UPDATE除了INSERT.

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

于 2020-10-20T08:59:59.110 回答
-1

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

在此处输入图像描述

于 2017-11-16T11:37:16.417 回答