繁体   English   中英

preparedStatement中的列索引无效

[英]Invalid column index in preparedStatement

我试图在数据库表中插入一个值,我一直在无效列索引错误的绊脚石。

这是一个代码示例:

        String insertNewAlarmStat =
            "insert into alarmes (id_alarm, alarm_key, id_notif, sever, urgency, date_hour_start, date_hour_modif, date_hour_end, " +
                    "state, state_rec, date_hour_rec,  id_user_rec, id_system_rec, " +
                    "type, cause, " +
                    "num_events, id_entity_g, type_entity_g, " +
                    "desc_entity_g, problem, " +
                    "time_urg_act, max_urg_act, time_end, time_arq, lim, rec_oblig, dn, num_events_ps, id_alarm_o, id_notif_o, text_ad, domain, date_hour_reg) " +
                    "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE, SYSDATE, SYSDATE, SYSDATE, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";
    PreparedStatement prpstmt = null ;
    try {
        prpstmt = conn.prepareStatement(insertNewAlarmStat);

        prpstmt.setInt(1, randomNumberGenerator());
        prpstmt.setString(2, UUID.randomUUID().toString());
        prpstmt.setString(3, UUID.randomUUID().toString());
        prpstmt.setInt(4, randomNumberGenerator());
        prpstmt.setInt(5, 8);
        prpstmt.setInt(6, 8524);
        prpstmt.setString(7, UUID.randomUUID().toString());
        prpstmt.setString(8, UUID.randomUUID().toString());
        prpstmt.setString(9, UUID.randomUUID().toString());
        prpstmt.setString(10, UUID.randomUUID().toString());
        prpstmt.setString(11, "KABOOM");
        prpstmt.setInt(12, 8);
        prpstmt.setDate(13, getCurrentDate());
        prpstmt.setDate(14, getCurrentDate());
        prpstmt.setDate(15, getCurrentDate());
        prpstmt.setDate(16, getCurrentDate());
        prpstmt.setInt(17, 43);
        prpstmt.setString(18, UUID.randomUUID().toString());
        prpstmt.setString(19, UUID.randomUUID().toString());
        prpstmt.setString(20, UUID.randomUUID().toString());
        prpstmt.setString(21, UUID.randomUUID().toString());
        prpstmt.setInt(22, 2);
        prpstmt.setInt(23, 224);
        prpstmt.setInt(24, 2);
        prpstmt.setInt(25, 224);            
        prpstmt.setInt(26, 2);
        prpstmt.setInt(27, 4);          
        prpstmt.setInt(28, 2);  
        prpstmt.setString(29, null);
        prpstmt.setString(30, UUID.randomUUID().toString());
        prpstmt.setString(31, UUID.randomUUID().toString());            
        prpstmt.setInt(32, 2);  

        prpstmt.execute();

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

我试图将prpstmt从13删除到16但它抱怨那些索引丢失,我也尝试了其他的东西,但我不能让它工作。

我究竟做错了什么?

去掉

prpstmt.setDate(13, getCurrentDate());
prpstmt.setDate(14, getCurrentDate());
prpstmt.setDate(15, getCurrentDate());
prpstmt.setDate(16, getCurrentDate());

而不是17,从13再次开始..

?,?,?,?,?,?,?,?,?,?,?,?,SYSDATE,SYSDATE,SYSDATE,SYSDATE,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,SYSDATE

1,2,3,4,5,6,7,8,9,10,11,12,SYSDATE,SYSDATE,SYSDATE,SYSDATE,13,14 ......等

此insert语句中有33列。 有33个值--28 ? 占位符和5个字面值( sysdate )。 setXYZ方法中的索引是指索引的? 占位符,而不是insert语句的值的索引。

对于sysdate值,您不需要执行任何操作,因此请删除对setDate调用。 但是对于超过前4个sysdate的值,您只需要使用下一个值,即13 ,而不是17

prpstmt.setInt(1, randomNumberGenerator());
// snip
prpstmt.setInt(12, 8);
// calls to `setDate(13-16, getCurrentDate());` removed
prpstmt.setInt(13, 43);  // changed 17 to 13
// snip
prpstmt.setInt(28, 2);   // changed 32 to 28

什么是 sysdate

sysdate是一个Oracle函数,它返回当前date/timestamp ,相当于Java中的Calendar.getInstance() 出于JDBC的目的,它是已在insert语句中提供的值。

您的查询String包含28个问号,我写了一个程序来为您统计

String str = "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE, SYSDATE, SYSDATE, "
    + "SYSDATE, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";
int count = 0;
for (char ch : str.toCharArray()) {
    if (ch == '?') {
        count++;
    }
}
System.out.println(count);

所以,你不能绑定32个参数。 我想你的

 prpstmt.setDate(13, getCurrentDate());
 prpstmt.setDate(14, getCurrentDate());
 prpstmt.setDate(15, getCurrentDate());
 prpstmt.setDate(16, getCurrentDate());

在查询中硬编码为SYSDATE 因此,删除查询中间的四个SYSDATE

"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
+ "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";

你有32岁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM