Oracle MERGE INTO的用法示例介绍

很多时候我们会出现如下情境,如果一条数据在表中已经存在,对其做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

 

举一反三啦,很多时候都可以用到的,整理自网络

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐