진심 오늘 몇 시간동안 내 AI자비스들이랑 머리 싸맸는데, 결국 해결책은 은둔 고수의 티스토리였다.
오늘 회사에서 오라클SQL + MYBATIS로 다중항목 insert하면서 생긴 오류들...
0)별의 별 방식으로 다 insert해봐도 안됐음. 아래는 시행 착오를 이겨내며 만들어낸 최종 코드.
<update id="insertI">
<foreach collection="list" item="item"
open="INSERT ALL " close="SELECT * FROM DUAL" separator=" ">
INTO I_TABLE (
I_SEQ,
I_NAME,
I_TYPE
) VALUES (
#{item.iSeq},
#{item.iName},
#{item.iType}
)
</foreach>
</update>
*foreach부분 잘 안보여서 엔터 넣어줬습니다... 원랜 들여쓰기 잘 합니다...변수명이랑 컬럼명도 급하게 바꾸느라 이 모양입니다..
AI들이 만들어 준 코드가 잘 안됐는데, 이상한 디테일이 모자라서 그랬다...근데 AI면 알아서 딱 깔끔하게 해줘야지...
1)foreach 태그의 위치
- mySql은 value쪽에 foreach쪽에 위치하는데, 오라클Sql + MyBatis는 최상위 태그 바로 아래에 있어야 함.
- MyBatis로 그냥 foreach구현 결과물만 보면 실행되어야 할 코든데 이상하게 오류가 계속 났다.. value쪽에서 반복하면 딱 깔끔하게 컬럼 한 번 들어가고 나머지만 반복되는데, 결국 실행하면 오류남;;;
2)separator는 공란으로 설정
- 세미콜론으로 끝내면 오류발생; 쉼표도 필요없음.
- 이건 MyBatis기능인데 그냥 공란으로 해두면 알아서 SQL합쳐줌
- 세미콜론 넣으면 oracle에서 오류남.
3)insert지만 update 태그로 감싼다(?)
- 진짜 이건 이유를 모르겠는데, 안되다가 태그만 바꾸니까 해결됨.
- MyBatis내부 처리방식때문인 거 같은데.. 2시간 넘게 안되는 이유 찾다가 아래 블로그 글 보고 해결함.
ai 왜 쓰냐...티스토리 보면 다 나오는데...
https://zorba91.tistory.com/189
[Oracle,MySQL] mybatis foreach문을 이용해 다중 insert 하는 법
Mysql과 oracle에서 다중 insert가 어떻게 다른지 비교하면서 설명할 생각이다. 먼저, MySQL에서 foreach로 다중 insert 사용 방법이다. 12345678910111213141516INSERT INTO choco_table ( number_id , public_id , div , create_date
zorba91.tistory.com
4)open, close속성
- foreach 태그 안쪽에서 open="INSERT ALL ", close="SELECT * FROM DUAL"을 넣어준다.
- SELECT * FROM DUAL은 Oracle SQL에서 쿼리가 정상적으로 완료되었음을 나타내는 역할.
- foreach 내부에 open과 close를 설정해야 SQL이 완전한 형태로 실행됨.
일단 위와 같은 이슈를 극복하고 최종 코드 형태로 만들어주면 이제 다중 insert가 가능해진다.
물론 내가 insert하는 데이터는 3만개가 넘어서 자바쪽에서 1000개씩 끊어 넣는 방식으로 구현했다.
암튼 오늘 오랜만에 화나는? 내용이라 일기처럼 글 남김...🔥