【问题标题】:"ORA-01008: not all variables bound" error“ORA-01008:并非所有变量都绑定”错误
【发布时间】:2011-09-22 02:55:48
【问题描述】:

我正在使用以下方法通过 jdbc 计算工资单,但“ORA-01008: not all variables bound”错误没有消除。

有什么想法吗?

我正在使用以下代码

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

【问题讨论】:

  • 你在什么时候得到这个异常?
  • 考勤是否与员工有某种联系?否则每个 e_id 的 select count(att_status) 没有意义(因为它永远不会改变)

标签: java oracle jdbc prepared-statement ora-01008


【解决方案1】:

你的问题在这里:

rs2 = pstmt.executeQuery(q2);

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

rs2 = pstmt.executeQuery();

这是一个相当常见的错误,主要是由于 java.sql.Statement 及其子类型的不良类设计造成的。

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

rs1 = pstmt.executeQuery(q1);

这无关紧要,因为q1 中没有占位符,所以SQL 会按原样执行。不过还是错了。

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

【讨论】:

  • 问题已解决。非常感谢您抽出宝贵时间。但我很困惑为什么我在这行代码中没有出现异常 rs1 = pstmt.executeQuery(q1);
  • @Adnan - rs1 不会抛出异常,因为 q1 没有任何绑定变量
  • +1,很好。在循环内检索select count(att_status) 也不是必需的,因为它不依赖于 e_id(至少在示例中不是。
【解决方案2】:

一个原因可能是您不能像那样重复使用 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 子句。

【讨论】:

  • 不,我不知道如何使用单个准备好的语句来完成。请告诉我如何使用单个准备好的语句来做到这一点?
【解决方案3】:
                            pstmt = conn.prepareStatement(q2);
                            pstmt.setInt(1,empId);
                            rs2 = pstmt.executeQuery(q2);

您已经使用查询 q2 创建了准备好的语句并将变量 empId 绑定到它。如果您现在调用 pstmt.executeQuery(q2),变量绑定将丢失。当您执行 pstmt.executeQuery(q2) 时,JDBC 驱动程序可能会解析未绑定的 sql q2。

【讨论】:

    【解决方案4】:

    更新 TESTTCP SET CP_KEY2 =?, CP_DESC =?, CP_MAKER =?, CP_MAKER_DT =SYSDATE, CP_STATUS ='M' WHERE CP_LANGUAGE = ?和 CP_ENG_CODE = ?和 CP_KEY1 =? AND CP_LANGUAGE =?

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

    那个时候也会出现这个错误。

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2020-05-06
      • 2021-12-11
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 2010-11-28
      相关资源
      最近更新 更多