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