欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle MERGE INTO的用法示例介绍

程序员文章站 2023-11-22 14:51:52
很多时候我们会出现如下情境,如果一条数据在表中已经存在,对其做update,如果不存在,将新的数据插入.如果不使用oracle提供的merge语法的话,可能先要上数据库se...
很多时候我们会出现如下情境,如果一条数据在表中已经存在,对其做update,如果不存在,将新的数据插入.如果不使用oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条sql语句完成.

1)主要功能
提供有条件地更新和插入数据到数据库表中
如果该行存在,执行一个update操作,如果是一个新行,执行insert操作
— 避免了分开更新
— 提高性能并易于使用
— 在数据仓库应用中十分有用

2)merge语句的语法如下: 
复制代码 代码如下:

merge [hint] into [schema .] table [t_alias] using [schema .]
{ table | view | subquery } [t_alias] on ( condition )
when matched then merge_update_clause
when not matched then merge_insert_clause;

3)示例
复制代码 代码如下:

merge into table target
using (select '111111111' store_no,
'2014-01' target_ym,
'1' target_d01,
'2' target_d02,
'2' target_d03,
'2' target_d04,
'2' target_d05,
'2' target_d06,
'2' target_d07,
'2' target_d08,
'2' target_d09,
'2' target_d10,
'2' target_d11,
'2' target_d12,
'2' target_d13,
'2' target_d14,
'2' target_d15,
'2' target_d16,
'2' target_d17,
'2' target_d18,
'2' target_d19,
'2' target_d20,
'2' target_d21,
'2' target_d22,
'2' target_d23,
'2' target_d24,
'2' target_d25,
'2' target_d26,
'2' target_d27,
'2' target_d28,
'2' target_d29,
'2' target_d30,
'2' target_d31,
1 user_id
from dual) temp
on (target.store_no = temp.store_no and target.target_ym = temp.target_ym)
when matched then
update
set target.target_d01 = temp.target_d01,
target.target_d02 = temp.target_d02,
target.target_d03 = temp.target_d03,
target.target_d04 = temp.target_d04,
target.target_d05 = temp.target_d05,
target.target_d06 = temp.target_d06,
target.target_d07 = temp.target_d07,
target.target_d08 = temp.target_d08,
target.target_d09 = temp.target_d09,
target.target_d10 = temp.target_d10,
target.target_d11 = temp.target_d11,
target.target_d12 = temp.target_d12,
target.target_d13 = temp.target_d13,
target.target_d14 = temp.target_d14,
target.target_d15 = temp.target_d15,
target.target_d16 = temp.target_d16,
target.target_d17 = temp.target_d17,
target.target_d18 = temp.target_d18,
target.target_d19 = temp.target_d19,
target.target_d20 = temp.target_d20,
target.target_d21 = temp.target_d21,
target.target_d22 = temp.target_d22,
target.target_d23 = temp.target_d23,
target.target_d24 = temp.target_d24,
target.target_d25 = temp.target_d25,
target.target_d26 = temp.target_d26,
target.target_d27 = temp.target_d27,
target.target_d28 = temp.target_d28,
target.target_d29 = temp.target_d29,
target.target_d30 = temp.target_d30,
target.target_d31 = temp.target_d31,
target.opt_counter = target.opt_counter + 1,
target.update_by = temp.user_id,
target.update_date = sysdate
when not matched then
insert
values
(seq.nextval,
temp.store_no,
temp.target_ym,
temp.target_d01,
temp.target_d02,
temp.target_d03,
temp.target_d04,
temp.target_d05,
temp.target_d06,
temp.target_d07,
temp.target_d08,
temp.target_d09,
temp.target_d10,
temp.target_d11,
temp.target_d12,
temp.target_d13,
temp.target_d14,
temp.target_d15,
temp.target_d16,
temp.target_d17,
temp.target_d18,
temp.target_d19,
temp.target_d20,
temp.target_d21,
temp.target_d22,
temp.target_d23,
temp.target_d24,
temp.target_d25,
temp.target_d26,
temp.target_d27,
temp.target_d28,
temp.target_d29,
temp.target_d30,
temp.target_d31,
null,
default,
default,
null,
temp.user_id,
default,
null,
null);

小帮助:

看到数据库表这么多字段是不是好烦,拷贝、写都麻烦还容易出错,可以如下操作:

1、先查询出表的所有字段
复制代码 代码如下:

select column_id,
column_name,
data_type,
data_length,
data_precision,
data_scale,
nullable,
data_default
from user_tab_columns
where table_name = 'table'
order by column_id

2、将该表列名拷贝到excel,使用函数concatenate
Oracle MERGE INTO的用法示例介绍 
举一反三啦,很多时候都可以用到的,整理自网络