“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个参数值。
那个时候也会发生这个错误。