Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;ORA-01008:并非所有变量都已绑定”;错误_Java_Oracle_Jdbc_Prepared Statement_Ora 01008 - Fatal编程技术网

Java &引用;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

我使用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按原样执行。但这仍然是错误的


<>最后,您应该考虑在第一个代码> 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(至少不在示例中)。不,我不知道如何使用单个准备语句来完成。请告诉我如何使用单个准备语句来完成?