在写Procedure的过程中,会遇到insert数据时主键不重复就插入,主键重复就update的需求(数据同步),对于这样的业务场景,我们有三种办法来解决:
1、MERGE INTO处理:
MERGE INTO A
USING (select * from b where ...) b
ON (A.key = B.key)
WHEN MATCHED THEN
UPDATE set a..
when not matched then
insert ...
dbms_output.put_line('同步...');
2、异常法:DUP_VAL_ON_INDEX
begin
insert....
dbms_output.put_line('新增...');
exception
WHEN DUP_VAL_ON_INDEX THEN
update..
dbms_output.put_line('修改...');
end;
3、先做UPDATE,后做INSERT
begin
update ....
dbms_output.put_line('修改...');
if sql%rowcount=0
then
insert ...
dbms_output.put_line('新增...');
end if;
end;
对于以上三种做法,如果A、B表差异很大的时候,首选Merge Into,效率高;