본문 바로가기
프로젝트/세미프로젝트-병원 종합정보시스템 사이트

[오류] java.sql.SQLSyntaxErrorException

by moca7 2024. 9. 23.

 

 

 

 

- 의료진 계정을 삭제하는 기능 구현에서 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 

 

 

 

- 해결.