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解决方法,需要了解的朋友可以参考下2012-11-11centos 6.5下安装oracle 11gR2与Oracle自动启动的配置
CentOS 下安装 Oracle 是一件比较麻烦的事情,下面这篇文章主要介绍了在 centos 6.5下安装oracle 11gR2的前的配置步骤,以及安装完成后,如何设置为随系统自动启动。配置完成后,启动图形化安装,没有什么可说的,本文就没有一一截图。需要的朋友可以参考借鉴。2017-01-01Oracle数据库ORA-28040:没有匹配的验证协议解决办法
这篇文章主要给大家介绍了关于Oracle数据库ORA-28040:没有匹配的验证协议问题的解决办法,ORA-28040是Oracle数据库的错误代码,表示没有匹配的验证协议,这通常是由于客户端和服务器之间的身份验证协议不匹配导致的,需要的朋友可以参考下2024-03-03Oracle三种循环(For、While、Loop)实现九九乘法表
这篇文章主要为大家详细介绍了Oracle三种循环For、While、Loop实现九九乘法表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-03-03
最新评论