批量插入数据使用merge into实现有则更新,无则插入操作。
假设有这样一张表:
create table demo(
fd_id varchar2(10 char) not null,
fd_name varchar2(20 char),
fd_age varchar2(3 char)
)
两种方式:
第一:使用中间表,数据先插入到demo_tmp这个中间表,之后在执行merge into
create table demo_tmp(
fd_id varchar2(10 char) not null,
fd_name varchar2(20 char),
fd_age varchar2(3 char)
)
merge into demo t
using (select * from demo_tmp) t1
on (t.fd_id = t1.fd_id)
when matched then
update set
t.fd_name=t1.fd_name,
t.fd_age=t1.fd_age
when not matched then
insert (t.fd_id, t.fd_name, t.fd_age) values(t1.fd_id, t1.fd_name, t1.fd_age)
第二:不使用中间表
merge into demo t
using (select count(fd_id) cou from demo where fd_id='1') t1
on (t1.cou > 0)
when matched then
update set
t.fd_name='测试name',
t.fd_age='测试'
where t.fd_id='1'
when not matched then
insert (t.fd_id, t.fd_name, t.fd_age) values('1','测试name','测试')
从效率上来说应该是使用中间表的速度会更快,毕竟不使用中间表的sql需要传入参数,循环执行,但是如果使用statement.addBatch(),statement.executeBatch批量操作,不使用中间表的速度会提高,但具体是那个效率更好,大家自己测试下。