multiple prepareStatements
Hi. I'm new to Java and am having problems with a prepareStatement
using the ? as placeholders. Can anyone help me understand why I'm
getting an error?
Here is the error referring to: pstmtUpdate.setInt(2, limit);
java.lang.ArrayIndexOutOfBoundsException: 1
at
sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter(JdbcOdbcPreparedStatement.java:
1023)
at
sun.jdbc.odbc.JdbcOdbcPreparedStatement.setChar(JdbcOdbcPreparedStatement.java:
3057)
at
sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString(JdbcOdbcPreparedStatement.java:
766)
at alarmfilter.AlarmFilter.filterAlarms(AlarmFilter.java:110)
at alarmfilter.AlarmFilter.main(AlarmFilter.java:143)
Here is my code:
package alarmfilter;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class AlarmFilter {
public void filterAlarms() throws Exception {
int site = 0, notify = 0, limit = 0, hours = 0;
int sCount = 0;
String cat = "", type = "", dev = "", dispStat = "", dispCom =
"";
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmtCount = null;
PreparedStatement pstmtUpdate = null;
ResultSet rsUnack = null;
ResultSet rsSite = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection(
"jdbc:odbc:GVR2Test", <username>, <password>);
stmt = conn.createStatement();
rsUnack = stmt.executeQuery(
"SELECT VRSC.ALARMS_INCOMING.ALI_SITE_ID, "
+ "VRSC.ALARMS_INCOMING.ALI_ALARM_NOTIFY_NBR, "
+ "VRSC.ALARMS_INCOMING.ALI_ALARM_CATEGORY, "
+ "VRSC.ALARMS_INCOMING.ALI_ALARM_TYPE, "
+ "VRSC.ALARMS_INCOMING.ALI_DEVICE_NBR, "
+ "VRSC.ALARMS_INCOMING.ALI_DISPOSITION_STATUS, "
+ "VRSC.ALARMS_INCOMING.ALI_DISPOSITION_COMMENT, "
+ "VRSC.ALARM_TYPES.ALT_FILTER_LIMIT, "
+ "VRSC.ALARM_TYPES.ALT_FILTER_HOURS "
+ "FROM VRSC.ALARMS_INCOMING INNER JOIN
VRSC.ALARM_TYPES "
+ "ON (VRSC.ALARMS_INCOMING.ALI_ALARM_CATEGORY = "
+ "VRSC.ALARM_TYPES.ALT_ALARM_CAT) AND "
+ "(VRSC.ALARMS_INCOMING.ALI_ALARM_TYPE = "
+ "VRSC.ALARM_TYPES.ALT_ALARM_TYPE) "
+ "WHERE (((VRSC.ALARMS_INCOMING.ALI_STATUS) = 1)
AND "
+ "((VRSC.ALARM_TYPES.ALT_FILTER_LIMIT) <> '0')
AND "
+ "((VRSC.ALARMS_INCOMING.ALI_MC_ID) In "
+ "('000001','000004'))) "
+ "GROUP BY VRSC.ALARMS_INCOMING.ALI_SITE_ID, "
+ "VRSC.ALARMS_INCOMING.ALI_ALARM_NOTIFY_NBR, "
+ "VRSC.ALARMS_INCOMING.ALI_ALARM_CATEGORY, "
+ "VRSC.ALARMS_INCOMING.ALI_ALARM_TYPE, "
+ "VRSC.ALARMS_INCOMING.ALI_DEVICE_NBR, "
+ "VRSC.ALARMS_INCOMING.ALI_DISPOSITION_STATUS, "
+ "VRSC.ALARMS_INCOMING.ALI_DISPOSITION_COMMENT, "
+ "VRSC.ALARM_TYPES.ALT_FILTER_LIMIT, "
+ "VRSC.ALARM_TYPES.ALT_FILTER_HOURS;");
pstmtCount = conn.prepareStatement(
"SELECT
Count(VRSC.ALARMS_INCOMING.ALI_ALARM_NOTIFY_NBR) "
+ "AS CountOfALI_ALARM_NOTIFY_NBR "
+ "FROM VRSC.ALARMS_INCOMING "
+ "WHERE (((VRSC.ALARMS_INCOMING.ALI_SITE_ID) = ?)
" //setInt 1
+ "AND ((VRSC.ALARMS_INCOMING.ALI_ALARM_CATEGORY)
= ?) " //setString 2
+ "AND ((VRSC.ALARMS_INCOMING.ALI_ALARM_TYPE) = ?)
" //setString 3
+ "AND ((VRSC.ALARMS_INCOMING.ALI_DEVICE_NBR) = ?)
" //setString 4
+ "AND ((VRSC.ALARMS_INCOMING.ALI_UNACK_DATE_TIME)
"
+ "(SYSDATE-(?/24))));"); //setInt 5
pstmtUpdate = conn.prepareStatement(
"UPDATE VRSC_ALARMS_INCOMING INNER JOIN
VRSC_ALARM_TYPES "
+ "ON (VRSC_ALARMS_INCOMING.ALI_ALARM_TYPE = "
+ "VRSC_ALARM_TYPES.ALT_ALARM_TYPE) AND "
+ "(VRSC_ALARMS_INCOMING.ALI_ALARM_CATEGORY = "
+ "VRSC_ALARM_TYPES.ALT_ALARM_CAT) "
+ "SET VRSC_ALARMS_INCOMING.ALI_USER_ID =
'MONITOR', "
+ "VRSC_ALARMS_INCOMING.ALI_DISPOSITION_STATUS =
'? " //setString 1
+ " - Closing per filter, does not exceed ? " //
setInt 2
+ "alarms in ? hours.', " //setInt 3
+ "VRSC_ALARMS_INCOMING.ALI_CLOSE_DATE_TIME =
SYSDATE, "
+ "VRSC_ALARMS_INCOMING.ALI_DISPOSITION_COMMENT =
'? " //setString 4
+ " - Closing per filter, does not exceed ? " //
setInt 5
+ "alarms in ? hours.', " //setInt 6
+ "VRSC_ALARMS_INCOMING.ALI_STATUS = 3, "
+ "VRSC_ALARMS_INCOMING.ALI_OPEN_DATE_TIME =
SYSDATE "
+ "WHERE
(((VRSC_ALARMS_INCOMING.ALI_ALARM_NOTIFY_NBR) = "
+ "?));"); //setInt 7
while (rsUnack.next()) {
site = rsUnack.getInt("ALI_SITE_ID");
notify = rsUnack.getInt("ALI_ALARM_NOTIFY_NBR");
cat = rsUnack.getString("ALI_ALARM_CATEGORY");
type = rsUnack.getString("ALI_ALARM_TYPE");
dev = rsUnack.getString("ALI_DEVICE_NBR");
dispStat =
rsUnack.getString("ALI_DISPOSITION_STATUS");
dispCom =
rsUnack.getString("ALI_DISPOSITION_COMMENT");
limit = rsUnack.getInt("ALT_FILTER_LIMIT");
hours = rsUnack.getInt("ALT_FILTER_HOURS");
pstmtCount.setInt(1, site);
pstmtCount.setString(2, cat);
pstmtCount.setString(3, type);
pstmtCount.setString(4, dev);
pstmtCount.setInt(5, hours);
rsSite = pstmtCount.executeQuery();
rsSite.next(); //move to first (and only) record
sCount = rsSite.getInt("CountOfALI_ALARM_NOTIFY_NBR");
if (sCount < limit) {
pstmtUpdate.setString(1, dispStat);
pstmtUpdate.setInt(2, limit);
pstmtUpdate.setInt(3, hours);
pstmtUpdate.setString(4, dispCom);
pstmtUpdate.setInt(5, limit);
pstmtUpdate.setInt(6, hours);
pstmtUpdate.setInt(7, notify);
pstmtUpdate.executeUpdate();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rsUnack != null) {
rsUnack.close();
}
if (rsSite != null) {
rsSite.close();
}
if (stmt != null) {
stmt.close();
}
if (pstmtCount != null) {
pstmtCount.close();
}
}
}
public static void main(String[] args) throws Exception {
AlarmFilter af = new AlarmFilter();
af.filterAlarms();
}
}
The queries work unless my problem is with the formatting of the ?'s.
Help is greatly appreciated.