我使用以下方法通过使用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();
}
}
}
答案 0 :(得分:31)
你的问题在这里:
rs2 = pstmt.executeQuery(q2);
您告诉PreparedStatement
执行SQL q2
,而不是执行先前准备的SQL。这应该只是:
rs2 = pstmt.executeQuery();
这是一个相当常见的错误,主要是由java.sql.Statement
及其子类型的错误类设计引起的。
正如@RMT指出的那样,你在这里犯了同样的错误:
rs1 = pstmt.executeQuery(q1);
这并不重要,因为q1
中没有占位符,因此SQL按原样执行。但这仍然是错误的。
最后,在将close()
变量重新分配给另一个变量之前,您应该考虑在第一个PreparedStatement
上调用pstmt
。如果你不这样做,你就有可能泄漏。
答案 1 :(得分:1)
一个原因可能是您不能像这样重复使用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子句。
答案 2 :(得分:1)
pstmt = conn.prepareStatement(q2);
pstmt.setInt(1,empId);
rs2 = pstmt.executeQuery(q2);
您已经使用查询q2创建了预准备语句,并将变量empId绑定到它。如果您现在调用pstmt.executeQuery(q2),则变量绑定将丢失。执行pstmt.executeQuery(q2)时,JDBC驱动程序可能会解析未绑定的sql q2。
答案 3 :(得分:-1)
UPDATE TESTCP SET CP_KEY2 =?,CP_DESC =?,CP_MAKER =?,CP_MAKER_DT = SYSDATE,CP_STATUS =' M' CP_LANGUAGE =? AND CP_ENG_CODE =? AND CP_KEY1 =? AND CP_LANGUAGE =?
在上面的查询中,我们在参数中有7个,但如果在你的java代码PreparedStatement中你只设置了6个参数值。
那个时候也会发生这个错误。