oracle中的replace?into使用及說明
oracle中的replace into
Mybaitis foreach批量insert以及配合oracle merge into函數(shù),批量update和insert
oracle中相當(dāng)于mysql的replace into函數(shù):merge into
- 因?yàn)樽髡呤褂脟?guó)產(chǎn)的神通數(shù)據(jù)庫(kù) 寫法與oracle相同 沒辦法使用mysql的replace into實(shí)現(xiàn)插入
- 使用merge into來代替 不太推薦使用這個(gè) 能不用盡量不用吧
使用方法
普通使用
- 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會(huì)報(bào)一個(gè)解析不了的語法錯(cuò)誤 但不影響實(shí)際結(jié)果 解決辦法暫未發(fā)現(xiàn)
com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'merge into
也算mybatis的bug吧 沒有update與insert都兼容的標(biāo)簽
用oracle的merge實(shí)現(xiàn)mysql的replace into
mysql
mysql有一個(gè)replace into的dml語句,類似insert,但是會(huì)在insert之前檢查表的唯一索引或主鍵。如果存在,就改為update操作。
這在很多應(yīng)用中是一個(gè)很常用的操作。有了這個(gè)replace into ,就可以將一個(gè) select后判斷后做update or insert改為一句話,甚是方便。
Oracle
Oracle9i引入了MERGE命令,你能夠在一個(gè)SQL語句中對(duì)一個(gè)表同時(shí)執(zhí)行inserts和upda tes操作. MERGE命令從一個(gè)或多個(gè)數(shù)據(jù)源中選擇行來updating或inserting到一個(gè)或多個(gè)表.在Oracle 10g中MERGE有如下一些改進(jìn):
1、UPDATE或INSERT子句是可選的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON條件中使用常量過濾謂詞來insert所有的行到目標(biāo)表中,不需要連接源表和目標(biāo)表
4、UPDATE子句后面可以跟DELETE子句來去除一些不需要的行
5、源表就是using關(guān)鍵字后面跟的表,目標(biāo)表就是將要被merge into的表
6、merge into 中所有的update、insert、delete都是針對(duì)目標(biāo)表來操作的。由于merge into已經(jīng)制定了操作的表,所以u(píng)pdate、insert、delete都不需要再顯示指出表名
作用:merge into 解決用B表跟新A表數(shù)據(jù),如果A表中沒有,則把B表的數(shù)據(jù)插入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); 總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Oracle中的translate函數(shù)和replace函數(shù)的用法詳解
- Oracle數(shù)據(jù)庫(kù)INSERT?INTO的幾種用法舉例
- Oracle在DML語句中使用returing?into子句
- SELECT INTO 和 INSERT INTO SELECT 兩種表復(fù)制語句詳解(SQL數(shù)據(jù)庫(kù)和Oracle數(shù)據(jù)庫(kù)的區(qū)別)
- oracle中merge into用法及實(shí)例解析
- oracle數(shù)據(jù)匹配merge into的實(shí)例詳解
- Oracle MERGE INTO的用法示例介紹
相關(guān)文章
win x64下安裝oracle 12c出現(xiàn)INS-30131報(bào)錯(cuò)的解決方法
這篇文章主要介紹了win x64下安裝oracle 12c出現(xiàn)INS-30131報(bào)錯(cuò)的解決方法,感興趣的小伙伴們可以參考一下2016-07-07
CMD操作oracle數(shù)據(jù)導(dǎo)庫(kù)過程圖解
這篇文章主要介紹了CMD操作oracle數(shù)據(jù)導(dǎo)庫(kù)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Oracle7.X 回滾表空間數(shù)據(jù)文件誤刪除處理方法
Oracle7.X 回滾表空間數(shù)據(jù)文件誤刪除處理方法...2007-03-03
使用imp和exp命令對(duì)Oracle數(shù)據(jù)庫(kù)進(jìn)行導(dǎo)入導(dǎo)出操作詳解
這篇文章主要介紹了使用imp和exp命令對(duì)Oracle數(shù)據(jù)庫(kù)進(jìn)行導(dǎo)入導(dǎo)出操作詳解,文中通過示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
關(guān)于Oracle12C默認(rèn)用戶名system密碼不正確的解決方案
這篇文章主要介紹了關(guān)于Oracle12C默認(rèn)用戶名system密碼不正確的解決方案 ,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
Oracle 數(shù)據(jù)庫(kù)管理腳本命名規(guī)范
Oracle 數(shù)據(jù)庫(kù)管理腳本命名規(guī)范...2007-03-03
ORACLE分區(qū)表轉(zhuǎn)換在線重定義DBMS_REDEFINITION
這篇文章主要為大家介紹了ORACLE分區(qū)表轉(zhuǎn)換在線重定義DBMS_REDEFINITION表,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Oracle查詢中OVER (PARTITION BY ..)用法
這篇文章主要介紹了Oracle查詢中OVER (PARTITION BY ..)用法,內(nèi)容和代碼大家參考一下。2017-11-11

