oracle中的replace into使用及说明

 更新时间:2024年06月20日 17:00:48   作者:闰土和猹。  
这篇文章主要介绍了oracle中的replace into使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

oracle中的replace into

Mybaitis foreach批量insert以及配合oracle merge into函数,批量update和insert

oracle中相当于mysql的replace into函数:merge into

  • 因为作者使用国产的神通数据库 写法与oracle相同 没办法使用mysql的replace into实现插入
  • 使用merge into来代替 不太推荐使用这个 能不用尽量不用吧

使用方法

普通使用

  • xml中
<update id="mergeStudents" parameterType="com.alibaba.dto.StudentDTO">
		merge into t_student a
		using
		(
			SELECT
			#{id} as id,
			#{name} as name,
			#{age} as age
			FROM dual
		) b
		on (
		a.id= b.id
		)
		when matched then
		UPDATE SET
		a.name= b.name,
		a.age=b.age
		when not matched then
		INSERT(
		a.id,
		a.name,
		a.age
		) VALUES(
		b.id,
		b.name,
		b.age
		)
	</update>

加上foreach

<update id="mergeStudents" parameterType="com.alibaba.dto.StudentDTO">
		merge into t_student a
		using
		(
		<foreach collection="stus" item="item" index="index" open=""
				 close="" separator="union all">
			SELECT
			#{item.id,jdbcType=VARCHAR} as id,
			#{item.name,jdbcType=VARCHAR} as name,
			#{item.age,jdbcType=VARCHAR} as age
			FROM dual
		</foreach>
		) b
		on (
		a.id= b.id
		)
		when matched then
		UPDATE SET
		a.name= b.name,
		a.age=b.age
		when not matched then
		INSERT(
		a.id,
		a.name,
		a.age
		) VALUES(
		b.id,
		b.name,
		b.age
		)
	</update>

弊端:

mybatis会报一个解析不了的语法错误 但不影响实际结果 解决办法暂未发现

com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'merge into

也算mybatis的bug吧 没有update与insert都兼容的标签

用oracle的merge实现mysql的replace into

mysql

mysql有一个replace into的dml语句,类似insert,但是会在insert之前检查表的唯一索引或主键。如果存在,就改为update操作。

这在很多应用中是一个很常用的操作。有了这个replace into ,就可以将一个 select后判断后做update or insert改为一句话,甚是方便。

Oracle

Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和upda tes操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle 10g中MERGE有如下一些改进:

1、UPDATE或INSERT子句是可选的

2、UPDATE和INSERT子句可以加WHERE子句

3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表

4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行

5、源表就是using关键字后面跟的表,目标表就是将要被merge into的表

6、merge into 中所有的update、insert、delete都是针对目标表来操作的。由于merge into已经制定了操作的表,所以update、insert、delete都不需要再显示指出表名

作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表;

语法

MERGE INTO [your table-name] [rename your table here]  
USING ( [write your query here] )[rename your query-sql and using just like a table]  
ON ([conditional expression here] AND [...]...)  
WHEN MATHED THEN [here you can execute some update sql or something else ]  
WHEN NOT MATHED THEN [execute something else here ! ]  

sql demo

如下所示:

merge into qq a  
using (select '2022' company_no, 'cname' company_name from qq where rownum<2) b  
on (a.company_no = b.company_no)  
WHEN MATCHED THEN  
  UPDATE SET a.company_name = a.company_name|| 'a'  
WHEN NOT MATCHED THEN  
  INSERT  
    (a.company_no, a.company_name)  
  VALUES  
    (b.company_no, b.company_name);  

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • oracle 10g OEM常规错误(Unknown host specified)解决

    oracle 10g OEM常规错误(Unknown host specified)解决

    本文将详细介绍oracle 10g OEM常规错误-------Unknown host specified解决方法,需要了解的朋友可以参考下
    2012-11-11
  • 快速学习Oracle触发器和游标

    快速学习Oracle触发器和游标

    oracle触发器和游标是面试中常问到的知识点,今天就抽空通过实例代码给大家介绍Oracle触发器和游标的示例代码,需要的朋友参考下吧
    2021-06-06
  • centos 6.5下安装oracle 11gR2与Oracle自动启动的配置

    centos 6.5下安装oracle 11gR2与Oracle自动启动的配置

    CentOS 下安装 Oracle 是一件比较麻烦的事情,下面这篇文章主要介绍了在 centos 6.5下安装oracle 11gR2的前的配置步骤,以及安装完成后,如何设置为随系统自动启动。配置完成后,启动图形化安装,没有什么可说的,本文就没有一一截图。需要的朋友可以参考借鉴。
    2017-01-01
  • Oracle sql批量插入多条数据的实现

    Oracle sql批量插入多条数据的实现

    这篇文章主要介绍了Oracle sql批量插入多条数据的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Oracle数据库ORA-28040:没有匹配的验证协议解决办法

    Oracle数据库ORA-28040:没有匹配的验证协议解决办法

    这篇文章主要给大家介绍了关于Oracle数据库ORA-28040:没有匹配的验证协议问题的解决办法,ORA-28040是Oracle数据库的错误代码,表示没有匹配的验证协议,这通常是由于客户端和服务器之间的身份验证协议不匹配导致的,需要的朋友可以参考下
    2024-03-03
  • Oracle数据库创建存储过程的示例详解

    Oracle数据库创建存储过程的示例详解

    这篇文章主要介绍了Oracle数据库创建存储过程的示例详解,存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作。对此感兴趣可以了解一下
    2020-07-07
  • Oracle三种循环(For、While、Loop)实现九九乘法表

    Oracle三种循环(For、While、Loop)实现九九乘法表

    这篇文章主要为大家详细介绍了Oracle三种循环For、While、Loop实现九九乘法表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 完美卸载Oracle数据库

    完美卸载Oracle数据库

    如果Oracle卸载不干净就会导致下次安装失败,这篇文章主要为大家详细介绍了Oracle完美卸载的全部过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • [Oracle] CPU/PSU补丁安装详细教程

    [Oracle] CPU/PSU补丁安装详细教程

    Oracle CPU的全称是Critical Patch Update, Oracle对于其产品每个季度发行一次安全补丁包,通常是为了修复产品中的安全隐患,以下是对CPU/PSU补丁安装的具体操作步骤进行了详细的分析介绍,需要的朋友可以参考
    2013-07-07
  • oracle 库中有表 但是查询显示表不存在的问题

    oracle 库中有表 但是查询显示表不存在的问题

    这篇文章主要介绍了oracle 库中有表 但是查询显示表不存在,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论