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

发布于 2024-11-18 03:32:21 字数 1605 浏览 6 评论 0原文

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

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 数据时遇到很多麻烦,因此尝试用临时字符串 setter 替换 clob setter,执行相同的代码没有任何问题,并且所有行都正确插入!

即。 peparedstatement.setClob(columnIndex, clob)

替换为

peparedstatement.setString(columnIndex, "String")

为什么表或视图确实存在错误,插入 clob 数据时会抛出错误。你们中有人可以解释一下吗?

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

I am getting below exception, when trying to insert a batch of rows to an existing table

ORA-00942: table or view does not exist

I can confirm that the table exists in db and I can insert data to that table using oracle
sql developer. But when I try to insert rows using preparedstatement in java, its throwing table does not exist error.

Please find the stack trace of error below

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) 

Can anyone suggest the reasons for this error ?

Update : Issue solved

There was no problem with my database connection properties or with my table or view name. The solution to the problem was very strange. One of the columns that I was trying insert was of Clob type. As I had a lot of trouble handling clob data in oracle db before, gave a try by replacing the clob setter with a temporary string setter and the same code executed with out any problems and all the rows were correctly inserted!!!.

ie. peparedstatement.setClob(columnIndex, clob)

was replaced with

peparedstatement.setString(columnIndex, "String")

Why an error table or view does exist error was throws for error in inserting clob data. Could anyone of you please explain ?

Thanks a lot for your answers and comments.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

你是年少的欢喜 2024-11-25 03:32:21

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

Oracle will also report this error if the table exists, but you don't have any privileges on it. So if you are sure that the table is there, check the grants.

残月升风 2024-11-25 03:32:21

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

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

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

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

There seems to be some issue with setCLOB() that causes an ORA-00942 under some circumstances when the target table does exist and is correctly privileged. I'm having this exact issue now, I can make the ORA-00942 go away by simply not binding the CLOB into the same table.

I've tried setClob() with a java.sql.Clob and setCLOB() with an oracle.jdbc.CLOB but with the same result.

As you say, if you bind as a string the problem goes away - but this then limits your data size to 4k.

From testing it seems to be triggered when a transaction is open on the session prior to binding the CLOB. I'll feed back when I've solved this...checking Oracle support.

萌︼了一个春 2024-11-25 03:32:21

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

即。 peparedstatement.setClob(columnIndex, clob)

替换为

peparedstatement.setString(columnIndex, "String")

There was no problem with my database connection properties or with my table or view name. The solution to the problem was very strange. One of the columns that I was trying insert was of Clob type. As I had a lot of trouble handling clob data in oracle db before, gave a try by replacing the clob setter with a temporary string setter and the same code executed with out any problems and all the rows were correctly inserted!!!.

ie. peparedstatement.setClob(columnIndex, clob)

was replaced with

peparedstatement.setString(columnIndex, "String")

记忆消瘦 2024-11-25 03:32:21

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

注意:没有评论权限,否则这可能是一条评论。

@unbeli is right. Not having appropriate grants on a table will result in this error. For what it's worth, I recently experienced this. I was experiencing the exact problem that you described, I could execute insert statements through sql developer but would fail when using hibernate. I finally realized that my code was doing more than the obvious insert. Inserting into other tables that did not have appropriate grants. Adjusting grant privileges solved this for me.

Note: Don't have reputation to comment, otherwise this may have been a comment.

知足的幸福 2024-11-25 03:32:21

我找到了如何解决这个问题,而不使用 JDBC 的 setString() 方法,该方法将数据限制为 4K。

您需要做的是使用preparedStatement.setClob(int parameterIndex, Reader 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;

现在一切都很好。

I found how to solve this problem without using JDBC's setString() method which limits the data to 4K.

What you need to do is to use preparedStatement.setClob(int parameterIndex, Reader reader). At least this is what that worked for me. Thought Oracle drivers converts data to character stream to insert, seems like not. Or something specific causing an error.

Using a characterStream seems to work for me. I am reading tables from one db and writing to another one using jdbc. And i was getting table not found error just like it is mentioned above. So this is how i solved the problem:

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;

All good now.

锦欢 2024-11-25 03:32:21

我们在 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);
        }

We experienced this issue on a BLOB column. Just in case anyone else lands on this question when encountering this error, here is how we resolved the issue:

We started out with this:

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

We resolved the issue by changing that line to this:

        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);
        }
太阳男子 2024-11-25 03:32:21

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

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

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

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

Is your script providing the schema name, or do you rely on the user logged into the database to select the default schema?

It might be that you do not name the schema and that you perform your batch with a system user instead of the schema user resulting in the wrong execution context for a script that would work fine if executed by the user that has the target schema set as default schema. Your best action would be to include the schema name in the insert statements:

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

update: Do you try to bind the table name as bound value in your prepared statement? That won't work.

故笙诉离歌 2024-11-25 03:32:21

它对我有用:

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

It works for me:

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"));
}
人疚 2024-11-25 03:32:21

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

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

请参阅https://stackoverflow.com/a/64352414/1089967

Is it possible that you are doing INSERT for VARCHAR but doing an INSERT then an UPDATE for CLOB?

If so, you'll need to grant UPDATE permissions to the table in addition to INSERT.

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

梦忆晨望 2024-11-25 03:32:21

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

在此处输入图像描述

Here I got the solution for the question. The problem is on glass fish if you are using it. When you create JNDI name make sure pool name is correct and pool name is the name of connection pool name that you are created.

enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文