批量插入数据使用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批量操作,不使用中间表的速度会提高,但具体是那个效率更好,大家自己测试下。