컴퓨터/기타

Mybatis - INSERT SELECT에서 ORA-00933 에러

달서비 2024. 5. 29. 23:43

회사에서 업무를 하던 중 쿼리를 만들다 다소 신기한 방식으로 해결하였습니다.

insert에서 update로 변경하는 것만으로 에러가 해결되어 공유하려고 합니다.

 

한줄요약 : INSERT SELECT 구문에서 실행이 안 되는 경우 태그를 insert에서 update로 바꾸어보자

database - pixabay

 

ORA-00933

ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다

해당 오류는 SQL 구문 작성 오류 시 문법 오류로 인한 것입니다. 오라클에서 필요한 명령어 쉼표, AND 등 명령어가 빠져 있거나 오타가 난 경우 발생할 수 있습니다.

 

Mybatis에서 발견한 오류

IDE에서 쿼리로 작성 할 때 실행시 문제가 없었으나 Mybatis에서 쿼리를 동일한 쿼리를 실행할 때  ORA-00933에러가 계속 발생하였습니다. 아래와 같이 XML에 태그값을 변경하여 해결하였습니다.

/*오류(Before)*/
<insert id="insert1" parameterType="String">
	INSERT INTO EX_TABLE (STUDENT_NUM, SCORE)  
	SELECT STUDENT_NUM, SCORE
	WHERE STUDENT_NUM = #{STUDENT_NUM}
</insert>

/*수정(After)*/
<update id="insert1" parameterType="String">
	INSERT INTO EX_TABLE (STUDENT_NUM, SCORE)  
	SELECT STUDENT_NUM, SCORE
	WHERE STUDENT_NUM = #{STUDENT_NUM}
</update>

 

태그를 바꾸는 것만으로 오류가 해결되는데 어떤 이유로 오류가 발생하는지 궁금해서 확인했습니다. 

 

오류발생 원인 및 해결 이유

Mybatis 태그의 목적과 사용 범위가 차이로 인하여 오류가 발생하였습니다. Mybatis에서 태그와 목적은 다음과 같습니다.

  • insert - 단순한 삽입 작업(INSERT INTO VALUES)을 처리
  • update - 복잡한 DML 작업 (INSERT SELECT, MERGE INTO) 등의 작업을 처리
  • delete - 단순한 삭제 작업(DELETE)을 처리

여기서 update 태그를 사용하는 이유는 복잡한  데이터 조작 언어(DML) 작업임을 update 태그로 표현하는 것입니다.  INSERT SELECT, MERGE INTO 같은 경우 데이터의 삽입과 갱신 두 가지 이상의 목적을 가지기 때문에 update 태그를 사용하는 것입니다. 이를 통하여 프로그램의 일관성과 유연성을 높일 수 있으며 추가로 트랜잭션과 관련한 작업(BEGIN, END, COMMIT)도 처리할 수 있습니다. 

 

 

작성시 도움이 된 게시글

https://blog.naver.com/PostView.naver?blogId=yjheum&logNo=10185390086

 

[펌]mybatis 오라클(oracle) insert select ORA-00933 에러

  원본글 1 : http://blog.naver.com/PostView.nhn?blogId=angelkum&logNo=130171872891 원본...

blog.naver.com

 

https://mybatis.org/mybatis-3/ko/index.html

 

mybatis – 마이바티스 3 | 소개

마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와

mybatis.org