BatchUpdateException:ORA-00942:不存在表或视图

时间:2018-09-03 02:54:43

标签: oracle jdbc

此问题发生在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();

1 个答案:

答案 0 :(得分:0)

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

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

尽管它在我自己的环境中可以正常工作,但是当应用程序在远程服务器上运行时,它却一直困扰着“表或视图不存在”。第三个版本是:

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

好的,这次它既可以在我的电脑上运行,也可以在远程服务器上工作。感谢@codeLover的建议和链接,它确实使我感到高兴,并节省了我的时间。赞赏!