此问题发生在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();
答案 0 :(得分:0)
应该是blob
类型的列,我没有正确地处理它。
首先,我从原始数据源中查询,然后通过以下方式获得结果集的blob
列
conn.getObject(index)
。接下来,通过conn.setObject
将blob列插入目标数据源。当然,这种方式根本不起作用,所以我更改为以下内容:
conn.setBlob(rs.getBlob(index)).
尽管它在我自己的环境中可以正常工作,但是当应用程序在远程服务器上运行时,它却一直困扰着“表或视图不存在”。第三个版本是:
conn.setBinaryStream(rs.getBlob(index).getBinaryStream());
好的,这次它既可以在我的电脑上运行,也可以在远程服务器上工作。感谢@codeLover的建议和链接,它确实使我感到高兴,并节省了我的时间。赞赏!