Ошибка "ORA-01008: не все переменные связаны"
Я использую следующий метод для расчета заработной платы с помощью jdbc, но ошибка "ORA-01008: не все переменные привязаны" не удаляется.
Любая идея, пожалуйста?
Я использую следующий код
public double getPayroll(){
ResultSet rs = null;
ResultSet rs1 = null;
ResultSet rs2 = null;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getDBConnection();
double dailyPay=0,basicPay=0,payroll2=0;
int houseRent=0,convAllow=0,noOfPresents=0,empId=0;
String q = "select e_id from employee";
pstmt = conn.prepareStatement(q);
rs = pstmt.executeQuery();
while (rs.next()) {
empId=rs.getInt(1);
String q1 = "select count(att_status) from attendance where att_status='p'";
pstmt = conn.prepareStatement(q1);
rs1 = pstmt.executeQuery(q1);
while(rs1.next()){
noOfPresents=rs1.getInt(1);
String q2 = "select e_salary,e_house_rent,e_conv_allow from employee where e_id=?";
pstmt = conn.prepareStatement(q2);
pstmt.setInt(1,empId);
rs2 = pstmt.executeQuery(q2);
while(rs2.next()){
dailyPay=rs2.getInt(1)/22;
houseRent=rs2.getInt(2);
convAllow=rs2.getInt(3);
basicPay=dailyPay*noOfPresents;
payroll2+=basicPay+houseRent+convAllow;
}
}
}
return payroll2;
}catch (Exception e) {
e.printStackTrace();
return 0.0;
} finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4 ответа
Ваша проблема здесь:
rs2 = pstmt.executeQuery(q2);
Вы говорите PreparedStatement
выполнить SQL q2
вместо того, чтобы выполнять предварительно подготовленный SQL. Это должно быть просто:
rs2 = pstmt.executeQuery();
Это довольно распространенная ошибка, вызванная в основном плохим дизайном класса java.sql.Statement
и его подтипы.
Как указывает @RMT, вы делаете здесь ту же ошибку:
rs1 = pstmt.executeQuery(q1);
Это не имеет большого значения, так как в q1
Таким образом, SQL выполняется как есть. Это все еще неправильно, хотя.
Наконец, вы должны рассмотреть вопрос о звонке close()
во-первых PreparedStatement
перед переназначением pstmt
переменная к другому. Вы рискуете получить утечку, если не сделаете этого.
pstmt = conn.prepareStatement(q2);
pstmt.setInt(1,empId);
rs2 = pstmt.executeQuery(q2);
Вы уже создали подготовленный оператор с запросом q2 и привязали к нему переменную empId. если вы теперь вызовете pstmt.executeQuery(q2), привязка переменной будет потеряна. Драйвер JDBC, вероятно, анализирует несвязанный sql q2 при выполнении pstmt.executeQuery(q2).
Одной из причин может быть то, что вы не можете повторно использовать экземпляр pstmt таким образом. Вы должны использовать отдельный экземпляр PreparedStatement на каждом уровне цикла.
Знаете ли вы, что это может быть сделано только с помощью одного заявления?
Редактировать:
Предполагая, что есть связь между сотрудником и посещаемостью, что-то вроде этого вернет сумму в одном запросе:
select sum( (e_salary / 22) * att_count + e_house_rent + e_conv_allow )
from (
select emp.e_salary
emp.e_house_rent,
emp.e_conv_allow,
(select count(att.att_status) from attendance att where att.e_id = mp.e_id) s att_count
from employee emp
) t
Если действительно посещаемость не связана с сотрудником, просто пропустите предложение where во вложенном select.
UPDATE TESTCP SET CP_KEY2 =?, CP_DESC =?, CP_MAKER =?, CP_MAKER_DT =SYSDATE, CP_STATUS ='M' WHERE CP_LANGUAGE =? И CP_ENG_CODE =? И CP_KEY1 =? И CP_LANGUAGE =?
В приведенном выше запросе у нас есть 7 по параметру, но если в вашем Java-коде PreparedStatement вы установили только 6 значений параметров.
В этот раз также произойдет эта ошибка.