2011-06-24 19 views
10

Tôi đang sử dụng phương pháp sau đây để tính toán biên chế bằng cách sử dụng jdbc nhưng "ORA-01008: không phải tất cả các biến bị ràng buộc" lỗi là không loại bỏ."ORA-01008: không phải tất cả các biến bị ràng buộc" lỗi

Bạn có ý tưởng nào không?

Tôi đang sử dụng đoạn mã sau

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

Tại thời điểm nào bạn nhận được ngoại lệ này? – RMT

+0

Có tham gia bằng cách nào đó liên kết với nhân viên không?Nếu không, 'select count (att_status)' cho mỗi e_id không có ý nghĩa (vì nó sẽ không bao giờ thay đổi) –

Trả lời

25

Vấn đề của bạn là ở đây:

rs2 = pstmt.executeQuery(q2); 

Bạn đang nói với PreparedStatement để thực hiện SQL q2, chứ không phải là thực hiện các lệnh SQL chuẩn bị trước đó. Điều này chỉ nên là:

rs2 = pstmt.executeQuery(); 

Đây là một sai lầm khá phổ biến, gây ra chủ yếu bởi thiết kế lớp xấu của java.sql.Statement và phân nhóm của nó.

Như @RMT chỉ ra, bạn mắc phải sai lầm tương tự ở đây:

rs1 = pstmt.executeQuery(q1); 

này không quan trọng quá nhiều, vì không có placeholders trong q1, do đó SQL thực như nó vốn có. Nó vẫn còn sai, mặc dù.

Cuối cùng, bạn nên cân nhắc gọi số close() trên số PreparedStatement đầu tiên trước khi gán lại biến số pstmt cho biến số khác. Bạn có nguy cơ bị rò rỉ nếu bạn không làm điều đó.

+1

Ngoài ra rs1 có lỗi tương tự – RMT

+0

Vấn đề đã được giải quyết.Thanks rất nhiều cho time.But của bạn tôi nhầm lẫn rằng tại sao tôi không nhận ngoại lệ trong dòng mã rs1 = pstmt.executeQuery (q1); – Adnan

+1

@Adnan - rs1 không ném ngoại lệ vì q1 không có bất kỳ biến liên kết nào –

1

Một lý do có thể là bạn không thể sử dụng lại thể hiện của pstmt như thế. Bạn phải sử dụng một cá thể PreparedStatement riêng biệt trong mỗi cấp độ của vòng lặp.

Bạn có biết rằng điều này có thể được thực hiện chỉ với một câu lệnh duy nhất không?

Sửa:
Giả sử có một mối quan hệ giữa người lao động và tham dự, một cái gì đó như thế này sẽ trả lại số tiền trong một yêu cầu duy nhất:

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 

Nếu thực sự tham gia không liên kết với người lao động, chỉ cần bỏ qua mệnh đề where trong lựa chọn lồng nhau.

+0

Không có i am không biết rằng làm thế nào nó có thể được thực hiện bằng cách sử dụng câu lệnh chuẩn bị đơn. tôi rằng làm thế nào tôi có thể làm điều đó bằng cách sử dụng tuyên bố chuẩn bị duy nhất? – Adnan

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

Bạn đã tạo câu lệnh đã chuẩn bị với truy vấn q2 và ràng buộc biến empId với nó. nếu bây giờ bạn gọi pstmt.executeQuery (q2), thì ràng buộc biến bị mất. Trình điều khiển JDBC có thể phân tích cú pháp sql q2 không liên kết khi bạn thực hiện pstmt.executeQuery (q2).

-1

CẬP NHẬT TESTCP SET CP_KEY2 = ?, CP_DESC = ?, CP_MAKER = ?, CP_MAKER_DT = SYSDATE, CP_STATUS = 'M' WHERE CP_LANGUAGE =? VÀ CP_ENG_CODE =? VÀ CP_KEY1 =? VÀ CP_LANGUAGE =?

Trong truy vấn ở trên, chúng tôi có 7 tham số nhưng nếu trong mã java PreparedStatement của bạn, bạn đã đặt chỉ 6 giá trị tham số.

Thời gian đó cũng xảy ra lỗi này.

Các vấn đề liên quan