"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);
당신이 말하는 것은PreparedStatement
SQL을 실행합니다.q2
이전에 준비한 SQL을 실행하는 대신이는 다음과 같습니다.
rs2 = pstmt.executeQuery();
이것은 꽤 흔한 실수이며, 주로 나쁜 수업 설계에 의해 발생합니다.java.sql.Statement
그리고 그 하위 유형.
@RMT가 지적했듯이 여기서도 동일한 실수를 저지릅니다.
rs1 = pstmt.executeQuery(q1);
이것은 그다지 중요하지 않습니다. 왜냐하면 자리 표시자가 없기 때문입니다.q1
SQL이 있는 그대로 실행됩니다.하지만 여전히 틀렸습니다.
마지막으로, 당신은 전화하는 것을 고려해야 합니다.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
'programing' 카테고리의 다른 글
리눅스에서 파이프를 닫아야 하는 이유는 무엇입니까? (0) | 2023.07.14 |
---|---|
애니메이션 DidStop에서 CA 애니메이션을 식별하는 방법은 무엇입니까? (0) | 2023.07.14 |
.NET 응용 프로그램에서는 SQL 쿼리가 느리지만 SQL Server Management Studio에서는 즉시 실행됨 (0) | 2023.07.14 |
Oracle / SQL - 단일 열에 있는 값의 발생 횟수 (0) | 2023.07.14 |
ORA-01779: 키가 보존되지 않은 테이블에 매핑되는 열을 수정할 수 없습니다. (0) | 2023.07.14 |