我试图在数据库表中插入一个值,但我仍然在无效列索引错误中遇到绊脚石。
这是一个代码示例:
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,但它抱怨这些索引丢失了,我也试过了其他的东西,但是我无法将其转到工作
我做错了什么?
答案 0 :(得分:2)
删除
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 ......等等
答案 1 :(得分:1)
此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
的目的,它是插入语句中已提供的值。
答案 2 :(得分:0)
您的查询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岁。