首页 > 解决方案 > 如何使用 JDBC 中的 PreparedStatement 在表中存储长值?

问题描述

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

有什么想法吗?

我尝试按照您在下面的建议单独运行每个语句,但出现错误:[错误 2644] [SQLState HY000] 数据库中没有更多空间

标签: javaprepared-statementteradatabatch-processingbulkinsert

解决方案


Teradata Database 错误 2644“数据库中没有更多空间”字面意思是数据库中没有更多空间。数据库中没有更多可用的永久空间。

要克服此错误,您可以增加数据库的永久空间,也可以从数据库中删除一些现有对象(例如表)。


推荐阅读