Mybatis bulkInsert / Mysql and Oracle

공부는 혼자하는 거·2021년 11월 3일
0

DB

목록 보기
5/7

트랜잭션 수를 최소화 할려고 일정 주기마다 한방에 insert 하는 구문을 작성하다가 생각치 못하게 시간이 좀 걸렸다. Mysql은 간단한데, Oracle은 좀 다르더라..

Mysql

<insert id="insertBatch" >
		insert into MeasureData(sid, pid, patientUserId, parame, valueUnit, value, startTime, endTime)
		values
		<foreach collection="list" index="index" item="data" separator=",">
		(
			#{data.sid},
			#{data.pid},
			#{data.patientUserId},
			#{data.parame},		
			#{data.valueUnit},		
			#{data.value},
			STR_TO_DATE(CONCAT(#{data.startTime}, '000'), '%y.%m.%d-%H:%i:%S.%f'),
			STR_TO_DATE(CONCAT(#{data.endTime}, '000'), '%y.%m.%d-%H:%i:%S.%f')		
		)		
		</foreach>
	</insert>

Oracle

<insert id="insertBatch" >
		<foreach collection="list" item="data" close="SELECT * FROM DUAL"  open="INSERT ALL" separator=" ">
			into MeasureData(mid, sid, pid, patientUserId, parame, valueUnit, value, startTime, endTime)
			values 
			(
			get_seq( 'MeasureData_seq' ),
			#{data.sid},
			#{data.pid},
			#{data.patientUserId},
			#{data.parame},
			#{data.valueUnit},
			#{data.value},
			TO_TIMESTAMP(CONCAT(#{data.startTime}, '000'), 'YY.MM.DD-HH24:MI:SS.FF6'),
			TO_TIMESTAMP(CONCAT(#{data.endTime}, '000'), 'YY.MM.DD-HH24:MI:SS.FF6')
			)
		</foreach>
	</insert>

시퀀스를 찾지 못해서 시퀀스를 리턴해주는 프로시저를 하나만들어야 했다.

//시퀀스 리턴 프로시저.

create or replace function get_seq( seq_name in varchar2 ) 
return 
  number 
is
  v_num number;
  sql_stmt varchar2(64);
begin
  sql_stmt := 'select ' || seq_name || '.nextval from dual';
  execute immediate sql_stmt into v_num;
  return v_num;
end;

참고

https://ehdvudee.tistory.com/17

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ljh0326s&logNo=221305741201

https://shplab.tistory.com/entry/Mybatis오라클-DB-에서-foreach-를-이용하여-다중-Insert-시-생겼던-문제

profile
시간대비효율

0개의 댓글