DB2 中带有准备好的语句和批处理的“无效数据转换”

Posted

技术标签:

【中文标题】DB2 中带有准备好的语句和批处理的“无效数据转换”【英文标题】:"Invalid data conversion" in DB2 with prepared statements and batch 【发布时间】:2016-04-03 01:54:29 【问题描述】:

我正在使用 JDBC 创建一个临时表,向其中添加记录(使用准备好的语句和批处理),然后将所有内容转移到另一个表:

        String createTemporaryTable = "declare global temporary table temp_table (RECORD smallint,RANDOM_INTEGER integer,RANDOM_FLOAT float,RANDOM_STRING varchar(600)) ON COMMIT PRESERVE ROWS in TEMP";

        statement.execute(createTemporaryTable);

        String sql = "INSERT INTO session.temp_table (RECORD,RANDOM_INTEGER,RANDOM_FLOAT,RANDOM_STRING) VALUES (?,?,?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        float f = 0.7401298f;
        Integer integer = 123456789;
        String string = "This is a string that will be inserted into the table over and over again.";

        // add however many random records you want to the temporary table
        int numberOfRecordsToInsert = 35000;

        for (int i = 0; i < numberOfRecordsToInsert; i++) 

            preparedStatement.setInt(1, i);
            preparedStatement.setInt(2, integer);
            preparedStatement.setFloat(3, (float) f);
            preparedStatement.setString(4, string);
            preparedStatement.addBatch();

        

        preparedStatement.executeBatch();

        // transfer everything from the temporary table just created to the main table
        String transferFromTempTableToMain = "insert into main_table select * from session.temp_table";
        statement.execute(transferFromTempTableToMain);

在此示例中,最多可以处理大约 30000 条记录。但是,如果我要插入 35000 条记录,则会收到以下错误:

无效的数据转换:请求的转换将导致丢失 精度为 32768。ERRORCODE=-4461, SQLSTATE=42815

【问题讨论】:

【参考方案1】:

问题是字段RECORDsmallintsmallint 是一个带符号的 16 位整数,范围为 -32768 到 32767。

因此不允许插入 32768 的 int 值,因为它不适合。您需要将记录声明为 INTEGER

【讨论】:

以上是关于DB2 中带有准备好的语句和批处理的“无效数据转换”的主要内容,如果未能解决你的问题,请参考以下文章

使用准备好的语句 DB2 时获取 SQLCODE=-313

SQL 查询的准备语句,错误 DB2 SQL 错误:SQLCODE=-206,SQLSTATE=42703

准备好的语句执行批处理所需的权限

如何使用 jdbc 准备好的语句传递可变数量的参数?

MYSQL - 准备好的语句 NULL 处理

DB2-400 中带有 CSSID 的十六进制值