BatchUpdateException:ORA-00942:表或视图不存在
Posted
技术标签:
【中文标题】BatchUpdateException:ORA-00942:表或视图不存在【英文标题】:BatchUpdateException:ORA-00942:TABLE OR VIEW DOES NOT EXIST 【发布时间】:2018-09-03 02:54:43 【问题描述】:这个问题发生在 jdbc 批量插入中。我从 Oracle 数据源查询,解析结果集,然后插入另一个 Oracle 数据源。我得到了连接元数据并打印了当前用户名和 url,两者都是无效的。 但是当它进行批量更新时,我得到了 ora-00942 异常。我很确定以上所有内容在数据库中都可以正常工作。有没有人遇到过这个异常,能给我一些建议吗?
编辑:
好的,我有一个名为 photos
的表,例如在 REMOTE_USER
中,我从中进行了查询。它给了我一个结果集,然后我解析它,然后将其插入到LOCAL_USER.photos
。我确实查询了我从 PL/SQL Developer 登录的LOCAL_USER.photos
。有趣的是我可以执行select
命令,但不能执行insert
。下面是部分代码。
conn = datasource.getConnection(); // notice that it was target datasource
DatabaseMetaData connMetaData = conn.getMetaData();
String userName = connMetaData.getUserName();
resultSet = ds.getResultSet();
ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount();
String insertSql = generateInsertSql(count, metaData, userName);
// this was generated through metaData , the output should be
// "insert into LOCAL_USER.photos(col1,col2) values(?,...)"
logger.error("insert clause is ", insertSql);
ps = conn.prepareStatement(insertSql);
conn.setAutoCommit(false);
while (resultSet.next()) // this was the original datasource
stageTotalNum++;
for (int i = 1; i <= count; i++)
Object object = resultSet.getObject(i);
dealClobColumn(ps, i, object);
ps.addBatch();
if (stageTotalNum % 500L == 0L)
ps.executeBatch(); // throws batchupdateexception.
ps.clearBatch();
conn.commit();
ps.executeBatch();
conn.commit();
【问题讨论】:
您能否提供更多信息?您还可以检查查询中的所有表是否都存在,并且所有这些表都可以从登录用户访问 @VasylMoskalov 编辑我的帖子,请检查。感谢您的宝贵时间。 您能否使用与datasource.getConnection()
中相同的凭据执行您的插入子句?
如果对您有帮助,请查看此链接:***.com/questions/6561650/…
@VasylMoskalov 我不知道这是否是 lob 问题。我的 photos
表有一个存储图像二进制数据的 blob 列。我用来查询和插入的是getObject
和setObject
。我在本地运行应用程序,它运行得很好,但是当我将它发布到远程服务器时,应用程序抛出了异常。
【参考方案1】:
应该是blob
类型的列,我没有正确处理它。
首先我从原始数据源查询然后得到结果集的blob
列
conn.getObject(index)
。接下来,我通过conn.setObject
将 blob 列插入到目标数据源中。当然这种方式根本行不通,所以我改为以下方式:
conn.setBlob(rs.getBlob(index)).
虽然它在我自己的环境中运行良好,但是当应用程序在远程服务器上运行时,它一直在为“表或视图不存在”而烦恼。第三个版本是:
conn.setBinaryStream(rs.getBlob(index).getBinaryStream());
好的,这次它可以在我的电脑和远程服务器上运行。感谢@codeLover 的建议和链接,它真的帮助了我并节省了我的时间。欣赏!
【讨论】:
以上是关于BatchUpdateException:ORA-00942:表或视图不存在的主要内容,如果未能解决你的问题,请参考以下文章