- 의료진 계정을 삭제하는 기능 구현에서 sql 문법 에러 발생.
- String 변수에 주민등록번호를 여럿 담아서, String 배열 형태로 jsp에서 가져왔다.
- 배열의 길이만큼 조건을 추가해서 doctor 테이블에서 삭제해야 한다.
(1) 쿼리
DELETE
FROM
DOCTOR
WHERE
USER_NO IN ( SELECT USER_NO FROM MEMBER WHERE USER_SSN = ?
, SELECT USER_NO FROM MEMBER WHERE USER_SSN = ?
, SELECT USER_NO FROM MEMBER WHERE USER_SSN = ?
, SELECT USER_NO FROM MEMBER WHERE USER_SSN = ?)
(2) dao
pstmt = conn.prepareStatement(sql);
for(int i=0; i<ssnArray.length; i++) {
pstmt.setString(i+1, ssnArray[i]);
}
System.out.println(sql); // 확인용
result = pstmt.executeUpdate();
- 배열의 길이만큼 반복문으로 쿼리를 추가하고, pstmt.setString 메소드로 ?를 배열의 요소로 채우게끔 작성했다.
- 그러나 SQLSyntaxErrorException 에러.
ㅁ 오류 원인
- 한 번에 여러 SELECT 구문을 IN 절 안에 나열하는 방식은 SQL에서 허용되지 않는다.
ㅁ 해결
※ 해결 방법 1. OR 연산자 사용
DELETE
FROM
DOCTOR
WHERE
USER_NO IN ( SELECT USER_NO FROM MEMBER WHERE USER_SSN = ?
OR USER_SSN = ?
OR USER_SSN = ?
OR USER_SSN = ?
...... );
- 한번의 select 서브쿼리로 여러 행을 가져온다.
※ 해결 방법 2. IN 연산자를 사용하되, 여러 개의 서브 쿼리 대신 한 개의 서브 쿼리 사용
(1) 쿼리
DELETE
FROM
DOCTOR
WHERE
USER_NO IN (SELECT USER_NO
FROM MEMBER
WHERE USER_SSN IN (
- doctor-mapper.xml에는 이렇게만 작성해 놓는다.
- dao에서 배열의 개수만큼 ?를 더하고 닫는 괄호를 2개 둬서 완성한다.
- 그리고 나서 배열의 개수만큼 pstmt.setString으로 ?를 배열의 각 요소들로 채워서 완성한다.
(2) dao
- 해결.
'프로젝트 > 세미프로젝트-병원 종합정보시스템 사이트' 카테고리의 다른 글
[오류] 빈문자열을 insert하는 경우, java.sql.SQLIntegrityConstraintViolationException (0) | 2024.09.27 |
---|---|
[오답] SYSDATE로 INSERT한 데이터가 조회되지 않음 (0) | 2024.09.26 |
[오답] Map 객체가 덮어씌워지는 문제 (0) | 2024.09.22 |
[오류] java.lang.Error: Unresolved compilation problem (0) | 2024.09.22 |
[오류] java.lang.NullPointerException (1) | 2024.09.22 |