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

aqu*_*ero 13 java sql oracle jdbc ora-00942

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

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) 
Run Code Online (Sandbox Code Playgroud)

任何人都可以提出这个错误的原因吗?

更新:问题已解决

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

即.peparedstatement.setClob(columnIndex,clob)

被替换为

peparedstatement.setString(columnIndex,"String")

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

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

unb*_*eli 13

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


小智 10

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

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

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

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


aqu*_*ero 7

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

即.peparedstatement.setClob(columnIndex,clob)

被替换为

peparedstatement.setString(columnIndex,"String")