DataBase/Oracle

[Oracle,MySQL] mybatis foreach문을 이용해 다중 insert 하는 법

희랍인 조르바 2018. 8. 31. 17:12

Mysql과 oracle에서 다중 insert가 어떻게 다른지 비교하면서 설명할 생각이다.


먼저, MySQL에서 foreach로 다중 insert 사용 방법이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INSERT INTO choco_table ( 
                       number_id
                     , public_id
                     , div
                     , create_date
                     , create_id
                 ) VALUES
             <foreach collection="list" item="item" index="index" separator=",">
                (
                       #{item.number_id}
                     , #{item.public_id}                         
                     , #{item.div}                             
                     , NOW()
                     , #{item.create_id}
                )
             </foreach>
cs


구분자가 콤마(,)로 구분된다. 값이 들어갈 부분 VALUES 이후부터 foreach를 걸어주면 된다.


반면 오라클은 사용 방법은 위와 같이 하면 에러가 난다. 


오라클에서의 사용방법은 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <foreach collection="list" item="item" index="index" separator=" " open="INSERT ALL" close="SELECT * FROM DUAL">
                 INTO choco_table  ( 
                       number_id                     
                     , public_id
                     , div
                     , create_date
                     , create_id                 
                ) VALUES(
                       #{item.number_id}                    
                     , #{item.public_id}                         
                     , #{item.div}                             
                     , SYSDATE
                     , #{item.create_id}
                )
             </foreach>
cs



INSERT ALL을 이용한다. 


구분자는 콤마가 아닌 공백(" ")으로 처리된다. 


foreach 자체 기능을 통해 open에 insert all을 해주고 마지막 select * from dual로 처리해준다.


* 추가내용: oracle을 사용하고 mybatis 사용시, xml문에서 mapper 형식을 insert(<insert id="" >)로 하면 sql command not properly ended 라는 에러가 난다. update(<update id="" ~~~>)로 해주어야 에러가 나지 않는다.


오라클 부분 출처: http://yamea-guide.tistory.com/166