디버깅∕오류해결

[Oracle] ORA-00933: SQL command not properly ended 오류 발생 원인과 해결 방법

728x90

문제 현상

특정 SQL문이 'ORA-00933: SQL command not properly ended" 오류 로그를 남기며 수행되지 못하는 현상이 발생했다.

 

문제 원인

에러 로그 중 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 구문에는 세미콜론(;)을 사용하지 않아야 한다.

세미콜론을 지우고 구동하자 정상적으로 동작하는 것을 확인할 수 있었다.

 

 

728x90