Ошибка «ORA-01008: не все переменные связаны» - PullRequest
11 голосов
/ 24 июня 2011

Я использую следующий метод для расчета заработной платы с помощью 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();
              }
            }
} 

Ответы [ 4 ]

31 голосов
/ 24 июня 2011

Ваша проблема здесь:

rs2 = pstmt.executeQuery(q2);

Вы указываете PreparedStatement выполнить SQL q2 вместо выполнения предварительно подготовленного SQL.Это должно быть просто:

rs2 = pstmt.executeQuery();

Это довольно распространенная ошибка, вызванная, в основном, неправильным дизайном класса java.sql.Statement и его подтипами.

Как указывает @RMT, вы делаете здесь ту же ошибку:

rs1 = pstmt.executeQuery(q1);

Это не имеет большого значения, поскольку в q1 нет заполнителей, поэтому SQL выполняетсякак есть.Однако это все еще не так.

Наконец, вам следует подумать о вызове close() для первого PreparedStatement, прежде чем переназначить переменную pstmt другой.Вы рискуете получить утечку, если не сделаете этого.

1 голос
/ 24 июня 2011
                            pstmt = conn.prepareStatement(q2);
                            pstmt.setInt(1,empId);
                            rs2 = pstmt.executeQuery(q2);

Вы уже создали подготовленный оператор с запросом q2 и привязали к нему переменную empId.если вы теперь вызовете pstmt.executeQuery (q2), привязка переменной будет потеряна.Драйвер JDBC, вероятно, анализирует несвязанный sql q2 при выполнении pstmt.executeQuery (q2).

1 голос
/ 24 июня 2011

Одной из причин может быть то, что вы не можете повторно использовать экземпляр 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 во вложенном выделении.

0 голосов
/ 28 июня 2016

ОБНОВЛЕНИЕ TESTCP 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 параметров, но если в вашем Java-коде PreparedStatement вы задали только 6 значений параметров.

В этот раз также произойдет эта ошибка.*

...