我有一个teradata表:
CREATE SET TABLE P_D.SAMPLE
(
ID DECIMAL(18,0),
ISBN DECIMAL(18,0),
TITLE varchar(100) null,
POSITION INT
)
我想从Java批量插入:
private static final String INSERT = "INSERT INTO P_D.SAMPLE (ID,ISBN,TITLE,POSITION) "
+ "VALUES (?,?,?,?)";
public void insert(List<Book> books) {
int booksCount = 0;
int batch_size = 15000;
PreparedStatement preparedStatement = connection.prepareStatement(INSERT);
for (Book book : books) {
preparedStatement.setLong(1, book.geId());
preparedStatement.setLong(2,book.getIsbn());
preparedStatement.setString(3, book.getTitle());
preparedStatement.setInt(4, book.getPosition());
preparedStatement.addBatch();
if (++booksCount % batch_size == 0) {
preparedStatement.executeBatch();
}
}
preparedStatement.executeBatch(); //inserting the remaining books
preparedStatement.close();
}
我收到以下错误:
[[Teradata JDBC驱动程序] [TeraJDBC 16.10.00.03] [错误1339] [SQLState HY000]执行PreparedStatement批处理请求时发生故障。该参数集未执行,应使用PreparedStatement executeUpdate方法分别重新提交。
有什么想法吗?
这基本上是一个RTFM问题。有关您的Oracle版本,请参考Oracle JDBC开发人员指南。
当您使用Oracle的JDBC驱动程序时,Oracle的DECIMAL数据类型映射到Java的BigDecimal
类。这意味着您需要使用方法setBigDecimal()
来为DECIMAL列分配值,即
preparedStatement.setBigDecimal(1, book.getId());
当然,这意味着方法
getId()
需要返回BigDecimal
。但是,如果没有,则需要根据方法BigDecimal
返回的值创建getId()
。再次,请参阅Java文档,以了解您的操作方式。
类似地,Oracle的INT数据类型映射到Java类java.lang.Integer
。