Java &引用;ORA-01008:并非所有变量都已绑定”;错误
我使用jdbc使用以下方法计算工资,但“ORA-01008:非所有变量绑定”错误并没有消除 有什么想法吗 我正在使用以下代码Java &引用;ORA-01008:并非所有变量都已绑定”;错误,java,oracle,jdbc,prepared-statement,ora-01008,Java,Oracle,Jdbc,Prepared Statement,Ora 01008,我使用jdbc使用以下方法计算工资,但“ORA-01008:非所有变量绑定”错误并没有消除 有什么想法吗 我正在使用以下代码 public double getPayroll(){ ResultSet rs = null; ResultSet rs1 = null; ResultSet rs2 = null; Connection conn = null; PreparedS
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
执行SQLq2
,而不是执行先前准备好的SQL。这应该是:
rs2 = pstmt.executeQuery();
这是一个相当常见的错误,主要是由于java.sql.Statement
及其子类型的类设计不好造成的
正如@RMT指出的,您在这里犯了同样的错误:
rs1 = pstmt.executeQuery(q1);
这并不重要,因为在q1
中没有占位符,所以SQL按原样执行。但这仍然是错误的
<>最后,您应该考虑在第一个代码> PravaReDebug < /C>中调用<代码>闭包()/代码>,然后重新分配<代码> PSTMT < /Cuff>变量到另一个。如果不这样做,您就有泄漏的风险。一个原因可能是您不能像那样重复使用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
如果考勤确实没有链接到employee,只需在嵌套的select中省略where子句
pstmt = conn.prepareStatement(q2);
pstmt.setInt(1,empId);
rs2 = pstmt.executeQuery(q2);
您已经使用查询q2创建了prepared语句,并将变量empId绑定到它。如果现在调用pstmt.executeQuery(q2),变量绑定将丢失。当您执行pstmt.executeQuery(q2)时,JDBC驱动程序可能会解析未绑定的sql q2。更新测试CP集CP\u KEY2=?,CP\u DESC=?,CP\u MAKER=?,CP\u MAKER\u DT=SYSDATE,CP\u STATUS='M',其中CP\u LANGUAGE=?和CP_ENG_CODE=?和CP_KEY1=?和CP_语言= 在上面的查询中,我们有7个In参数,但如果在java代码PreparedStatement中只设置了6个参数值
此时也会发生此错误。在什么时候出现此异常?考勤是否与员工存在某种关联?否则,每个e_id的
选择计数(att_status)
就没有意义了(因为它永远不会改变)问题已经解决。非常感谢您的时间。但是我不明白为什么我在这行代码rs1=pstmt.executeQuery(q1)中没有得到异常@Adnan-rs1不会抛出异常,因为q1没有任何绑定变量+1,这很好。在循环中检索select count(att_status)
也是不必要的,因为它不依赖于e_id(至少不在示例中)。不,我不知道如何使用单个准备语句来完成。请告诉我如何使用单个准备语句来完成?