문제 현상
특정 SQL문이 "ORA-00933: SQL command not properly ended" 오류 로그를 남기며 수행되지 못하는 현상이 발생했다.
"SQLSyntaxErrorException -> ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다"
문제 원인
에러 로그 중 SQLSyntaxErrorException (문법 에러)라는 키워드에 힌트를 얻어 SQL문을 살펴봤다. 보통은 쿼리 작성 시 오타나 잘못된 SQL 문법을 사용했을 경우 발생하는 에러이다.
다만, 내 경우엔 아래 쿼리처럼 단순 SELECT 문이어서 문법상 잘못된 점을 찾아보기 어려웠다.
SELECT column_1, column_2 FROM my_table;
원인을 알아본 결과, SQL 구문 끝에 세미콜론(;) 이 포함되었기 때문임을 알았다.
SQL 표준 문법 상, SQL 구문은 세미콜론(;)으로 끝맺는 것이 옳다고 알고 있어서 납득하기 어려웠다.
문제 재현을 위해 간단한 JDBC SELECT 쿼리 테스트를 진행해 보았다.
결론적으로 Oracle DB는 JDBC 쿼리에서 세미콜론을 입력한 경우 아래의 에러를 반환하는 것을 알 수 있었다.
java.sql.SQLSyntaxErrorException: ORA-00911: invalid character
실제로 오라클 포럼에도 왜 JDBC Oralce에서는 세미콜론이 허용되지 않는가 에 대한 질문이 올라와있다.
오라클에서 세미콜론(;)은 SQL-Plus 혹은 PL/SQL 에서 Statement 구분을 위해 사용되고
ODBC/JDBC, OLEDB, 등 다른 연결 방식을 사용할 때는 문장 끝에 세미콜론(;)을 붙이지 않아야 한다고 한다.
해결방법
Oracle JDBC 단순 SQL 구문에는 세미콜론(;)을 사용하지 않아야 한다.
SELECT column_1, column_2 FROM my_table
세미콜론을 지우고 구동하자 정상적으로 동작하는 것을 확인할 수 있었다.
'디버깅∕오류해결' 카테고리의 다른 글
[PostgreSQL] "치명적오류: 최대 동시 접속자 수를 초과했습니다" 오류 발생 원인과 해결 방법 (1) | 2024.12.20 |
---|---|
[IntelliJ] No candidates found for method call plugins 오류 해결(Gradle 프로젝트) (0) | 2024.10.11 |
[IntelliJ - Gradle build] error: package javax.xml.bind does not existimport javax.xml.bind.DatatypeConverter; (0) | 2024.05.20 |
[IntelliJ] 프로젝트 import 구문 에러 발생할 경우, 해결 방법 (0) | 2024.05.20 |
Address already in use: JVM_Bind (0) | 2022.04.03 |