“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(); } } } 

你的问题在这里:

 rs2 = pstmt.executeQuery(q2); 

您告诉PreparedStatement执行SQL q2 ,而不是执行先前准备的SQL。 这应该只是:

 rs2 = pstmt.executeQuery(); 

这是一个相当常见的错误,主要是由java.sql.Statement及其子类型的错误类设计引起的。

正如@RMT指出的那样,你在这里犯了同样的错误:

 rs1 = pstmt.executeQuery(q1); 

这并不重要,因为q1中没有占位符,因此SQL按原样执行。 但它仍然是错的。

最后,在将pstmt变量重新分配给另一个变量之前,应该考虑在第一个PreparedStatement上调用close() 。 如果你不这样做,你就有可能泄漏。

  pstmt = conn.prepareStatement(q2); pstmt.setInt(1,empId); rs2 = pstmt.executeQuery(q2); 

您已经使用查询q2创建了预准备语句,并将变量empId绑定到它。 如果您现在调用pstmt.executeQuery(q2),则变量绑定将丢失。 执行pstmt.executeQuery(q2)时,JDBC驱动程序可能会解析未绑定的sql 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子句即可。

UPDATE TESTCP SET CP_KEY2 =?,CP_DESC =?,CP_MAKER =?,CP_MAKER_DT = SYSDATE,CP_STATUS =’M’WHERE CP_LANGUAGE =? AND CP_ENG_CODE =? AND CP_KEY1 =? AND CP_LANGUAGE =?

在上面的查询中,我们有7个参数,但如果在你的java代码PreparedStatement中你只设置了6个参数值。

那个时候也会发生这个错误。