程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Oracle+Mybatis的foreach insert批量拔出報錯的疾速處理方法

Oracle+Mybatis的foreach insert批量拔出報錯的疾速處理方法

編輯:關於JAVA

Oracle+Mybatis的foreach insert批量拔出報錯的疾速處理方法。本站提示廣大學習愛好者:(Oracle+Mybatis的foreach insert批量拔出報錯的疾速處理方法)文章只能為提供參考,不一定能成為您想要的結果。以下是Oracle+Mybatis的foreach insert批量拔出報錯的疾速處理方法正文


比來做一個批量導入的需求,將多筆記錄批量拔出數據庫中。

處理思緒:在法式中封裝一個List聚集對象,然後把該聚集中的實體拔出到數據庫中,由於項目應用了MyBatis,所以盤算應用MyBatis的foreach功效停止批量拔出。時代碰到了“SQL 敕令未准確停止 ”的毛病,終究處理,記載上去供今後查閱和進修。

起首,在網上參考了有關Mybatis的foreach insert的材料,詳細以下:

foreach的重要用在構建in前提中,它可以在SQL語句中停止迭代一個聚集。

foreach元素的屬性重要有 item,index,collection,open,separator,close。

item表現聚集中每個元素停止迭代時的別號,index指定一個名字,用於表現在迭代進程中,每次迭代到的地位,open表現該語句以甚麼開端,separator表現在每次停止迭代之間以甚麼符號作為分隔符,close表現以甚麼停止,在應用foreach的時刻最症結的也是最輕易失足的就是collection屬性,該屬性是必需指定的,然則在分歧情形 下,該屬性的值是紛歧樣的,重要有一下3種情形:

1.假如傳入的是單參數且參數類型是一個List的時刻,collection屬性值為list

2.假如傳入的是單參數且參數類型是一個array數組的時刻,collection的屬性值為array

3.假如傳入的參數是多個的時刻,我們就須要把它們封裝成一個Map了,固然單參數也能夠封裝成map

然後,照葫蘆畫瓢寫了以下的xml文件,

xxxMapper.xml文件:

<insert id="addSupCity" parameterType="java.util.List">
<selectKey keyProperty="cityId" order="BEFORE" resultType="String">
<![CDATA[SELECT SEQ_OCL_SUPCITY.NEXTVAL FROM dual]]>
</selectKey>
INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT)
VALUES 
<foreach collection="list" item="item" index="index" separator=","> 
(
#{item.cityId,jdbcType=VARCHAR},
#{item.cityCode,jdbcType=VARCHAR},
#{item.cityName,jdbcType=VARCHAR},
#{item.areaDesc,jdbcType=VARCHAR},
#{item.supId,jdbcType=VARCHAR},
#{item.stat,jdbcType=VARCHAR}
)
</foreach>
</insert>

然則運轉起來後就一向報錯,報錯信息以下:

### SQL: INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?)
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 敕令未准確停止

把SQL復制出來在PL/SQL中運轉也是報異樣的錯,如上也能夠看出,應用批量拔出履行的SQL語句等價於: INSERT INTO T_OCL_SUPCITY (CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?),而在oracle頂用insert into xxx values (xxx,xxx),(xxx,xxx) 這類語法是通不外的 。再回過火去看那篇文章,發明這是實用於MySQL的,不實用於Oracle,是以把xml文件修正一下:

<insert id="addSupCity" parameterType="java.util.List">
INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT)
SELECT SEQ_OCL_SUPCITY.NEXTVAL CITY_ID, A.*
FROM(
<foreach collection="list" item="item" index="index" separator="UNION ALL">
SELECT 
#{item.cityCode,jdbcType=VARCHAR} CITY_CODE,
#{item.cityName,jdbcType=VARCHAR} CITY_NAME,
#{item.areaDesc,jdbcType=VARCHAR} AREA_DESC,
#{item.supId,jdbcType=VARCHAR} SUP_ID,
#{item.stat,jdbcType=VARCHAR} STAT
FROM dual
</foreach>
)A
</insert>

運轉經由過程。

在Oracle的版本中,有幾點須要留意的:

1.SQL中沒有VALUES;

2.<foreach>標簽中的(selece ..... from dual);

3.<foreach>標簽中的separator的屬性為"UNION ALL",將查詢歸並成果集。

以上所述是小編給年夜家引見的Oracle+Mybatis的foreach insert功效批量拔出報錯的疾速處理方法,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved