【问题标题】:Java DB2: Sql Arrays in prepared INSERTS generates "Invalid data conversion: Parameter instance is invalid for the requested conversion"Java DB2:准备好的 INSERTS 中的 SQL 数组生成“无效数据转换:参数实例对于请求的转换无效”
【发布时间】:2023-01-27 23:14:17
【问题描述】:

我正在对旧的 DB2 服务器执行大型 INSERT,出于各种原因,我需要它们尽可能快。

根据https://developer.ibm.com/articles/dm-0403wilkins/,提高插入速度的最有效方法之一是使用带有数组插入的准备语句。这就是我正在尝试的。

这是代码:

    String sql="INSERT INTO MY_DATABASE (ID, COL1, COL2, NAME, TAG) VALUES (?, 'LO', 'MI', ?, ?)";

    Integer[] ids = [I create an array of Integers here, this code is irrelevant.]
    String[] names = [I create an array of Strings here, this code is irrelevant.]
    String[] tags = [I create an array of Strings here, this code is irrelevant.]

    try {
        Array idArray = conn.createArrayOf("INTEGER",ids);
        Array nameArray = conn.createArrayOf("CHAR",names);
        Array tagArray = conn.createArrayOf("CHAR",tags);

        PreparedStatement ps = conn.prepareStatement(sql);

        ps.setArray(1,idArray);
        ps.setArray(2, nameArray);
        ps.setArray(3, tagArray);

        ps.executeUpdate();

    }catch(SQLException sqle) {
        log.warning("Prepared statement failed: "+sqle);
    }

所有行都执行得很好,除了 Prepared Statement 的执行。我收到此错误:

com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][1091][10417][4.23.42] Invalid data conversion: Parameter instance com.ibm.db2.jcc.am.o@f736069 is invalid for the requested conversion. ERRORCODE=-4461, SQLSTATE=42815

我检查过的内容:

MY_DATABASE 中的列分别具有 TYPE_NAME:INTEGER (10)、CHAR (10)、CHAR (2)、CHAR (15)、CHAR (1)。那里没有错。

StackOverflow 上带有此错误代码和 sqlstates 的类似问题一直是关于使用超过阈值的 smallint 和整数,不适用于我对数组的使用。

我已经看到我可以通过遍历我的数组,一个一个地设置参数,然后执行ps.addBatch()来实现大约相同的事情,但是从我在 IBM 链接上读到的内容来看,似乎使用 sql-arrays 插入这样快了将近 5 倍,所以我希望它能工作。

现在,“com.ibm.db2.jcc.am.o@f736069”看起来非常像没有 toString() 方法的对象的字符串输出。此外,它显然是由 db2 驱动程序创建的对象。我不知道是不是驱动程序试图将“com.ibm.db2.jcc.am.o@f736069”转换为整数,或者它可能是什么。

不幸的是,我不能尝试省略整数数组,因为它是一个不会自动递增的主键。

【问题讨论】:

  • 据我所知,您的插入不需要数组,因为 MY_DATABASE 没有数组列。如果要执行多组值插入多行的语句,则应设置一行的值,然后调用addBatch(),设置下一行的值,调用addBatch()等,然后,当您添加了所有行后,请致电executeBatch()

标签: java sql arrays insert db2


【解决方案1】:

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2021-08-31
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多