회사에서 업무를 하던 중 쿼리를 만들다 다소 신기한 방식으로 해결하였습니다.
insert에서 update로 변경하는 것만으로 에러가 해결되어 공유하려고 합니다.
한줄요약 : INSERT SELECT 구문에서 실행이 안 되는 경우 태그를 insert에서 update로 바꾸어보자
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
'컴퓨터 > 기타' 카테고리의 다른 글
Llama - 로컬에서 생성형 AI를 돌려보자 (GPT4ALL) (2) | 2024.08.27 |
---|---|
WAS - 아파치(Apache)와 톰캣(Apache Tomcat) (2) | 2024.04.20 |
MyBatis - MyBatis에서 부등호를 처리하자 (1) | 2024.02.10 |
WOL - 집에서 원격 부팅을 하자 (Wake On Lan) (0) | 2023.08.12 |
Excel - 전역일 계산기를 만들어보자 (5) | 2022.08.08 |