最近接到一个新的接口需求,开发一个保存数据的接口,需要完成如下功能:有一个表T,有两个字段a(主键),b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条记录。
  在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL Server中的语法如下:

if exists(select 1 from T where T.a=’1001’ ) update T set T.b=2 Where T.a=’1001’ else insert into T(a,b) values(‘1001’,2);

但是因为现场的数据库是Oracle,所以不能用上面的语法,那么在Oracle中我们如何实现这种功能呢?首选方案就是使用存储过程。Oracle 9i之后有一条Merge into 的语句可以同时进行Insert和Update。
merge into语法:

MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
WHEN MATCHED THEN  [UPDATE sql]
WHEN NOT MATCHED THEN  [INSERT sql]  

将merge into用于以上的表逻辑:

MERGE INTO T t1USING (SELECT 'xxx' FROM T WHERE t.a='1001') t2ON(t1.a = t2.a)
WHEN MATCHED THENUPDATE SET t1.b=2 WHERE t1.a='1001'
WHEN NOT MATCHED THENINSERT (t1.a,t1.b) VALUES('1001','2')

以上语句实现的功能用中文来描述就是:
  在t2中查出来的数据,每一条都要跟t1进行ON(join condition)的比较。如果匹配,就进行更新,否则进行插入操作。
  所以,我们可以看出,在一个同时存在insert和update的merge的语句中,总共insert/update的记录数就是USING语句中t2的记录数。

附录(本次需求用到的存储过程实例):

create or replace procedure PRC_SAVE_USER_OPTIONS(MOBILENO in varchar2,LANGUAGES in varchar2) is
beginMERGE INTO tbl_v8_mobile_language tvUSING (select nvl(max(t.MOBILE_NO), 'AAAAAAAAAAAAA') as MOBILE_NOfrom tbl_v8_mobile_language twhere t.MOBILE_NO = MOBILENO) tv2ON (tv.MOBILE_NO = tv2.MOBILE_NO)WHEN MATCHED THENUPDATE SET tv.LANGUAGE = LANGUAGESWHEN NOT MATCHED THENINSERT (tv.mobile_no, tv.language) values (MOBILENO, LANGUAGES);commit;
end;

引申:
  上面我们说过“在一个同时存在insert和update的merge的语句中,总共insert/update的记录数就是USING语句中t2的记录数。”我们可以根据这个记录数的不同进行不同的操作。
1、只操作一张表的时候:
  当USING语句中查出来的值只有一条时就只能进行insert/update操作,有多条时就可以既能insert又能update。
如:
  1)当USING中的查询语句为SELECT ‘xxx’ FROM T t WHERE t.a=’1001’ (a为主键),此时t2中只有一条数据,只能进行insert/update操作。
  2)当USING中的查询语句为SELECT ‘xxx’ FROM T,查出T表中的所有数据,此时t2中的数据是表T的所有数据,这就是全表操作了,既能insert又能update。
2、操作两张表的时候:
  这种方法与操作一张表类似,只不过在操作一张表的时候t1、t2代表的都是一张表内的数据,而操作两张表的时候t1、t1代表的是两张表的数据。具体应用请参照这篇文章:oracle中merge into用法解析

【存储过程】Merge Into语句实现Insert/Update在Oracle中的应用相关推荐

  1. Merge Into 语句代替Insert/Update在Oracle中的应用实战

    动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录 ...

  2. mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...

    SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...

  3. oracle数据库insert into,oracle中insert into用法 oracle中insert如何带条件添加数据?

    oracle insert into 脚本怎么写 INSE INTO BOOK(bookid,name,price) VALUES('100123','oracle ',54); 或者 INSE IN ...

  4. DML语句(delete,insert,update)

    DML语句 一.概述:DML (Data Manipulation Language 数据操作语言) insert 将记录插入到数据库 update 修改数据库的记录 delete 删除数据库的记录c ...

  5. oracle instead of update触发器,Oracle中的instead of触发器

    Instead of : 用Trigger的内容替换 事件本身的动作,该触发器用在视图上,举例: 一:创建一个update替代触发器 (1)创建一个视图 1 create or replace vie ...

  6. oracle insert into insert,总结下Oracle 中的Insert用法

    1.标准Insert --单表单行插入 语法: INSERT INTO table [(column1,column2,...)] VALUE (value1,value2,...) 例子: inse ...

  7. oracle分页查询sql语句的rn,Mysql和Oracle中的分页SQL语句

    以前总结过一篇,Oracle分页查询语句的优化,当时对Oracle分页语句也着实花费了点时间记忆,不过今天在面试的时候,又考到了不同数据库的分页sql语句,对Oracle数据库的书写又存在了问题,以为 ...

  8. oracle 存储过程以及plsql语句块

    1. PLSQL语法 1.1.程序结构 PL/SQL程序都是以块(block)为基本单位.整个PL/SQL块分三部分:声明部分(用declare开头).执行部分(以 begin开头)和异常处理部分(以 ...

  9. oracle的insert写法,oracle中的insert语句

    关键字: ORACLE insert into table oracle中的insert语句 在oracle中使用DML语言的insert语句来向表格中插入数据,先介绍每次只能插入一条数据的语法 IN ...

最新文章

  1. mapreduce value 排序_MapReduce知识点一
  2. labuladong的算法小抄pdf_随机算法:水塘抽样算法
  3. 深入讲解微信小程序上传图片与JAVA后台的结合
  4. LeetCode求能够装得最多的水
  5. dreambackend.java_【AndroidTV】如何自定义屏保、更改屏保时长
  6. Java 中的 String 真的是不可变的吗
  7. docker多个容器一起打包_如何实现多个docker容器同时执行一条命令?
  8. 分布式模块之间的调用_分布式事务
  9. python输出被五整除的数_python中给定一系列正整数能被5整除的数字中所有偶数的和?...
  10. Python入门学习笔记05(内置函数)
  11. 修改 idea 主题
  12. 眼部识别和指纹识别,你会选择谁?
  13. 如何制作一个自己的四足机器人
  14. U-boot简介及常用命令说明
  15. 计算机主机箱工作电流,电脑使用常识
  16. 塔望3W消费战略全案丨阳澄湖牌大闸蟹:承诺就是价值,打响官方第一枪
  17. 神经网络模型计算量分析
  18. 草图vr3.6许可证服务器安装失败,SU2018装Vray3.6出现这个是怎么回事啊
  19. (转载)基于sklearn的iris数据集及简介
  20. 电话机器人API接口-空号识别-座席WEBAPI

热门文章

  1. 【多图】近距离接触甲骨文总裁马克赫德,Oracle在上海香格里拉酒店数据中心优化专题研讨会...
  2. asp.net faq: 在html文件中,用js获取session
  3. MongoDB 常用故障排查工具
  4. 自动删除过期归档日志
  5. android 解决Date.gettimezoneoffset已经废弃
  6. android 获取手机运行的进程
  7. WebKit 内核源码分析 (二) FrameLoader
  8. Android程序运行时出现java.lang.OutOfMemoryError 错误
  9. JDBC数据库查询操作
  10. PHP基础入门(五)---PHP面向对象实用基础知识