merge into 函数 oracle 数据库独有的函数,在9i版本以后添加的。具体历史和支持版本请百度。
merge into 函数 主要实现有则更新无则插入。
一般格式如下
merge into t_info_archives[表名] table1 [源表]
using (v_info_archives[视图/表名/] ) view1 [条件应用表]
on(view1.age > 18)[条件]
when matched then[符号条件]
update set table1.AdultSign = '1'[所执行的语句]
when not matched then [不符合条件]
update set table1.AdultSign ='0' [所执行的语句];
个人理解 merge into 是类似与If 语句 的分支,只不过功能比较强大,适合做数据的批量变更,由于是官方函数,执行速度也是非常理想的。
重点:有则更新无则插入
merger into 需要修改的表名 t1
using (select count(1) as num from 需要修改的表名 where 条件 ) t2
on (t2.num > 0) --判断是否有符合条件的数据
when matched then
update set 要修改的数据 where 条件 --要记住,这里要加条件否则的话,将是将全变进行修改
when not matched then
insert (表字段) values(要插入的值)
直接上deom
表 t_info_archives
name | age | adultsign
张三 | 21 | NULL
李四 | 18 | NULL
王五 | 17 | NULL
sql <
MERGE INTO t_info_archives t1
USING (SELECT COUNT(1) AS NUM FROM t_info_archives WHERE age < 18 ) t2
ON (t2.num > 0)
WHEN MATCHED THEN
UPDATE SET t1.adultsign = 1 WHERE age < 18
WHEN NOT MATCHED THEN
INSERT (NAME , age , adultsign) VALUES ('马六' , '16', '1');
结果
name | age | adultsign
张三 | 21 | NULL
李四 | 18 | NULL
王五 | 17 | 1
sql语句的逻辑为:判断表中是否有小于18岁的,有则将其成年标志位置1
修改 sql 年龄将 18改为17 ,表中没有符合的,执行语句。
结果
name | age | adultsign
张三 | 21 | NULL
李四 | 18 | NULL
王五 | 17 | 1
马六 | 16 | 1
有则更新,无则插入 就是上面这样的。
这个merge into 可以有多种变形 ,主要看的你要判断 什么, 符合执行什么,不符合执行 什么。
扔个彩蛋。关于 pro*c 编译 merge into 报错 的处理方式。可以放弃EXEC SQL 这样的形式,采用动态sql 形式 执行。