获取exceptionORA-00942:表或视图不存在 – 插入现有表时

在尝试将一批行插入现有表时,我遇到exception

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

即。 peparedstatement.setClob(columnIndex,clob)

被替换为

peparedstatement.setString(columnIndex,“String”)

为什么错误表或视图确实存在错误导致插入clob数据时出错。 你能解释一下吗?

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

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

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

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

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

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

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

即。 peparedstatement.setClob(columnIndex,clob)

被替换为

peparedstatement.setString(columnIndex,“String”)

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

注意:没有评论的声誉,否则这可能是一个评论。

我发现如何在不使用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; 

一切都很好。

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

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

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

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

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

这个对我有用:

 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名称时,请确保池名称正确,池名称是您创建的连接池名称。

在此处输入图像描述