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 列。我用来查询和插入的是getObjectsetObject。我在本地运行应用程序,它运行得很好,但是当我将它发布到远程服务器时,应用程序抛出了异常。 【参考方案1】:

应该是blob 类型的列,我没有正确处理它。 首先我从原始数据源查询然后得到结果集的blobconn.getObject(index) 。接下来,我通过conn.setObject 将 blob 列插入到目标数据源中。当然这种方式根本行不通,所以我改为以下方式:

 conn.setBlob(rs.getBlob(index)).

虽然它在我自己的环境中运行良好,但是当应用程序在远程服务器上运行时,它一直在为“表或视图不存在”而烦恼。第三个版本是:

conn.setBinaryStream(rs.getBlob(index).getBinaryStream());

好的,这次它可以在我的电脑和远程服务器上运行。感谢@codeLover 的建议和链接,它真的帮助了我并节省了我的时间。欣赏!

【讨论】:

以上是关于BatchUpdateException:ORA-00942:表或视图不存在的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01031: 权限不足

Spring Data JPA闭合连接

批量执行时如何查找失败的sql语句

Oracle批量插入数据时报字段无法识别错误

Oracle批量插入数据时报字段无法识别错误

准备好的语句执行批处理所需的权限