programing

"ORA-01008: 일부 변수가 바인딩되지 않음" 오류

telecom 2023. 7. 14. 23:40
반응형

"ORA-01008: 일부 변수가 바인딩되지 않음" 오류

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

문제는 여기에 있습니다.

rs2 = pstmt.executeQuery(q2);

당신이 말하는 것은PreparedStatementSQL을 실행합니다.q2이전에 준비한 SQL을 실행하는 대신이는 다음과 같습니다.

rs2 = pstmt.executeQuery();

이것은 꽤 흔한 실수이며, 주로 나쁜 수업 설계에 의해 발생합니다.java.sql.Statement그리고 그 하위 유형.

@RMT가 지적했듯이 여기서도 동일한 실수를 저지릅니다.

rs1 = pstmt.executeQuery(q1);

이것은 그다지 중요하지 않습니다. 왜냐하면 자리 표시자가 없기 때문입니다.q1SQL이 있는 그대로 실행됩니다.하지만 여전히 틀렸습니다.

마지막으로, 당신은 전화하는 것을 고려해야 합니다.close()처음에PreparedStatement다시 시작하기 전에pstmt변수가 하나 더 있습니다.그렇게 하지 않으면 누출될 위험이 있습니다.

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

이제 pstmt를 호출하면 이미 쿼리 q2로 준비된 문을 만들고 변수 empId를 이 문에 바인딩했습니다.executeQuery(q2), 변수 바인딩이 손실됩니다.pstmt를 실행하면 JDBC 드라이버가 바인딩되지 않은 sqlq2를 구문 분석합니다.executeQuery(q2)를 선택합니다.

한 가지 이유는 pstmt 인스턴스를 그렇게 다시 사용할 수 없기 때문일 수 있습니다.루프의 각 수준에서 별도의 준비된 문 인스턴스를 사용해야 합니다.

이 작업은 단 한 번의 진술로도 수행할 수 있다는 것을 알고 계십니까?

편집:
직원과 출석률 사이에 관계가 있다고 가정하면 다음과 같은 경우 한 번의 요청으로 금액을 반환합니다.

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 절을 생략합니다.

업데이트 TESTCP SET CP_KEY2 =?, CP_DESC =?, CP_MAKER =?, CP_MAKER_DT =?, CP_STATUS ='M', CP_ENG_CODE =? 및 CP_KEY1 =? 및 CP_LANG =?

위 쿼리에서 매개 변수는 7개이지만 Java 코드 PreparedStatement에서 매개 변수 값을 6개만 설정한 경우입니다.

그 시간에도 이 오류가 발생할 것입니다.

언급URL : https://stackoverflow.com/questions/6469753/ora-01008-not-all-variables-bound-error

반응형