如何使用JDBC中的PreparedStatement在表中存储长值?

问题描述 投票:0回答:1

我有一个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方法分别重新提交。

有什么想法吗?

java prepared-statement teradata batch-processing bulkinsert
1个回答
0
投票

这基本上是一个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

© www.soinside.com 2019 - 2024. All rights reserved.