2011-06-24 12 views
10

Estoy utilizando el siguiente método para calcular la nómina usando jdbc pero el error "ORA-01008: no todas las variables vinculadas" no se está eliminando."ORA-01008: no todas las variables vinculadas" error

¿Alguna idea por favor?

estoy usando siguiente código

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

¿En qué momento está obteniendo esta excepción? – RMT

+0

¿La asistencia está de alguna manera vinculada al empleado?De lo contrario, el 'select count (att_status)' para cada e_id no tiene sentido (ya que nunca cambiará) –

Respuesta

25

Su problema está aquí:

rs2 = pstmt.executeQuery(q2); 

que estás diciendo la PreparedStatement para ejecutar el SQL q2, en lugar de ejecutar el SQL preparada previamente. Esto sólo debería ser:

rs2 = pstmt.executeQuery(); 

Este es un error muy común, causada principalmente por el diseño de la clase de mal java.sql.Statement y sus subtipos.

Como @RMT señala, que hacen que el mismo error aquí:

rs1 = pstmt.executeQuery(q1); 

esto no importa mucho, ya que no existen marcadores de posición en q1, por lo que el SQL se ejecuta como está. Sin embargo, todavía está mal.

Por último, debe considerar llamar al close() en el primer PreparedStatement, antes de volver a asignar la variable pstmt a otra. Arriesgas una fuga si no haces eso.

+1

También rs1 hay un error similar – RMT

+0

Problema resuelto. Muchas gracias por su tiempo. Pero estoy confundido por eso. no obteniendo excepción en esta línea de código rs1 = pstmt.executeQuery (q1); – Adnan

+1

@Adnan - rs1 no arroja excepciones porque q1 no tiene ninguna variable de vinculación –

1

Una razón podría ser que no puede volver a utilizar la instancia de pstmt de esa manera. Debe usar una instancia de PreparedStatement por separado en cada nivel del ciclo.

¿Sabía que esto se puede hacer con una sola declaración también?

Editar:
Suponiendo que es una relación entre el empleado y la asistencia, algo como esto sería devolver la suma en una sola petición:

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 

Si, efectivamente, la asistencia no está vinculada a los empleados, simplemente omita la cláusula where en la selección anidada.

+0

No, no estoy al tanto de cómo se puede hacer usando una sola declaración preparada. Dígale amablemente yo, ¿cómo puedo hacer eso usando solo una declaración preparada? – Adnan

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

Ya ha creado la instrucción preparada con la consulta q2 y le ha vinculado el texto variable. si ahora invoca pstmt.executeQuery (q2), se pierde el enlace variable. El controlador JDBC probablemente analiza el sql sin unir q2 cuando ejecuta pstmt.executeQuery (q2).

-1

ACTUALIZAR CONJUNTO DE PRUEBA CP_KEY2 = ?, CP_DESC =?, CP_MAKER = ?, CP_MAKER_DT = SYSDATE, CP_STATUS = 'M' WHERE CP_LANGUAGE =? Y CP_ENG_CODE =? Y CP_KEY1 =? Y CP_LANGUAGE =?

En la consulta anterior tenemos 7 en el parámetro, pero si en su código Java PreparedStatement ha establecido solo 6 valores de parámetros.

En ese momento también se producirá este error.

Cuestiones relacionadas