java - 在 DB2 上使用 JDBC 更新异常

标签 java jdbc db2

导致异常的代码如下:

    for (int i = 0; i < updateParams.size(); i++) {
        s = con.prepareStatement(sSQL);
        params = (String[][]) updateParams.get(i);
        setParamsPreparedStatement(s, params);
        log.debug("executeUpdates: " + sSQL + "[params:" + Arrays.deepToString(params) + "]");
        Date d = new Date();
        s.execute();
        log.info("STATEMENT EXECUTE TIME IN SECOND=" + (new Double(new Date().getTime() - d.getTime()) / 1000));
        rowcount += s.getUpdateCount();
        s.close();
    }

异常的确切行是 s.execute。

跟踪是:

com.ibm.db2.jcc.c.SqlException: The value of a host variable in the EXECUTE or OPEN statement is out of range for its corresponding use.
    at com.ibm.db2.jcc.c.fg.d(fg.java:1340)
    at com.ibm.db2.jcc.b.gb.k(gb.java:351)
    at com.ibm.db2.jcc.b.gb.a(gb.java:60)
    at com.ibm.db2.jcc.b.w.a(w.java:52)
    at com.ibm.db2.jcc.b.wb.c(wb.java:213)
    at com.ibm.db2.jcc.c.gg.ab(gg.java:1779)
    at com.ibm.db2.jcc.c.gg.d(gg.java:2324)
    at com.ibm.db2.jcc.c.gg.d(gg.java:2420)
    at com.ibm.db2.jcc.c.gg.X(gg.java:1332)
    at com.ibm.db2.jcc.c.gg.execute(gg.java:1316)

插入查询是:

insert into CMP_RULES_ACTIONS (RULE_ID, ACTION_ID, CAMPAIGN_ID, creation_date, LAST_UPDATE_DATE, expiry_date, activation_date, enabled, priority, GROUP_ID, owner) values (?, ?, ?, sysdate, sysdate, to_date(?,'YYYY/MM/DD HH24:MI'), to_date(?,'YYYY/MM/DD HH24:MI'), 1, ?, ?, ?)

参数是:

[params:[[freebuy_wv_scomm_bonus_perc_863, 12], [sendgenericbonuslist, 12], [863, 4], [2101/01/31 00:00, 12], [2013/03/21 16:14, 12], [0, 4], [null, 12], [null, 12]]]

谷歌搜索异常消息没有任何结果。我是 DB2 的新手。谁能帮帮我?

更新

我如何在准备好的语句中设置参数的示例:

public void setParamsPreparedStatement(PreparedStatement s, String[][] params) throws Exception {
    log.debug("Params are: " + Arrays.deepToString(params));
    for (int i = 0; i < params.length; i++) {
        if (params[i][1].equals(ParamTypes.ORA_TYPE_INTEGER)) {
            if (params[i][0] != null && !params[i][0].trim().equals("")) {
                s.setInt(i + 1, Integer.parseInt(params[i][0]));
            } else {
                s.setNull(i + 1, Types.INTEGER);
            }
        }

 ...
}

解决方案

我试图将一个长字符串放入一个太短的字段中。现在字段变长了,我的代码成功了。

最佳答案

问题是一个字段,即 RULE_ID,对于我试图插入的值(“freebuy_wv_scomm_bonus_perc_863”)而言太短 (VARCHAR(30) )。

关于java - 在 DB2 上使用 JDBC 更新异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551769/

相关文章:

java - 滚动 JScrollPane 到底部

java - mvn 测试失败,但从 IntelliJ IDEA 运行测试通过

java - 无法使用 Java 泛型选择合适的方法

java - 如何在 iframe jquery execCommand 中创建表?

hibernate - 事务回滚,但插入了一条记录

java - Mysql Java Derby Netbeans : 'deleteRow' not allowed because the ResultSet is not an updatable ResultSet

java - 保持数据库连接打开还是每次需要时重新打开它?

java - DB2 : Grant all privileges to db2admin on the localhost database

sql - 使用 SQL 获取库中所有文件的行数

java - 在 DB2 中创建表查询