oracle + ibatis 批量新增數據的幾種方法整理

循環插入太耽誤時間,業務需要批量新增數據,網上大概有說了四種方法。

#1.(錯誤的方法)

INSERT INTO XXX(XXX,XXX) VALUES (XXX,XXX),(YYY,YYY),(ZZZ,ZZZ)

把上面的語句用iterate標籤寫成ibatis的格式,但實際上oracle不支持這種方式。

#2.(沒有使用序列時可以使用的方法)

INSERT ALL
INTO XXX(XXX,XXX) VALUES (XXX,XXX)
INTO XXX(XXX,XXX) VALUES (XXX,XXX)
INTO XXX(XXX,XXX) VALUES (XXX,XXX)
SELECT 1 FROM DUAL

由於我的業務需要用到序列,這種方法每一行得到的序列號是相同的 ,不好用。insert all into並不表示一個表中插入多條記錄,而是表示多表插入各一條記錄,而這多表可以是同一個表,就成了單表插入多條記錄。根據後面子查詢的結果,前面每條into語句執行一次,博客正文中value都是“字面量”,所以用select 1 from dual返回一條記錄即可。
參考地址:https://docs.oracle.com/database/121/SQLRF/statements_9015.htm#SQLRF01604

另外這種方式只可以插入1000行數據以下。

 

#3.

INSERT INTO XXX(XXX,XXX) 
VALUES 
SELECT XXX,XXX FROM (
    SELECT XXX,XXX FROM DUAL 
    UNION ALL 
    SELECT XXX,XXX FROM DUAL 
    UNION ALL 
    SELECT XXX,XXX FROM DUAL
)

這種方法沒有數據量的限制(不超過64k即可),但是可讀性比較差,也會報錯ORA-02287:此處不允許序號(sequence number not allowed here),必須要改寫成這種格式才行,可讀性更差

INSERT INTO XXX(XXX,XXX) 
VALUES 
SELECT XXX.NEXTVAL,T.C2,T.C3 FROM (
    SELECT XXX C2,XXX C3 FROM DUAL 
    UNION ALL 
    SELECT XXX,XXX FROM DUAL 
    UNION ALL 
    SELECT XXX,XXX FROM DUAL
) T

#4.由於速度主要是開關連接,所以使用begin end吧,簡單粗暴

BEGIN
    INSERT INTO XXX(XXX,XXX) VALUES (XXX,XXX);
    INSERT INTO XXX(XXX,XXX) VALUES (XXX,XXX);
    INSERT INTO XXX(XXX,XXX) VALUES (XXX,XXX);
    INSERT INTO XXX(XXX,XXX) VALUES (XXX,XXX);
END;

IBATIS寫法供參考

    <insert id="saveCustElementList" parameterClass="java.util.List"> 
        <iterate open="begin" close="end;">
            INSERT INTO GDT_CUST_ELEMENT (
                ELEMENT_ID,
                BUSS_ID,
                JSP_PAGE,
                ORDER_NUMBER,
                PREFIX,
                ELEMENT_KEY,
                ELEMENT_NAME,
                POSTFIX,
                IS_REQUIRED,
                CONTROL_TYPE,
                CONTROL_LENTGH,
                IS_CLASSIFICATION,
                CLASSIFICATION_NO,
                LIST_DISPLAY,
                DEFAULT_VALUE,
                VALUE_FORMAT,
                VALUE_MAX_LENTGH,
                REGISTER_AVALIABLE_MODE,
                APPLY_AVALIABLE_MODE,
                CONTRACT_MODIFY_AVALIABLE_MODE,
                CONTENT_MODIFY_AVALIABLE_MODE,
                GROUP_NUMBER,
                IS_FIXED,
                FIXED_ID,
                IS_ENABLE_FLG,
                HTML_CONTENT,
                HTML_STYLE,
                HTML_CLASS,
                HTML_SPAN,
                SUBTABLE,
                CREATE_DATE,
                CREATER_PERSON,
                UPDATE_DATE,
                UPDATE_PERSON
            ) VALUES (
                SEQ_GDT_CUST_ELEMENT.NEXTVAL,
                #list[].bussId#,
                #list[].jspPage#,
                #list[].orderNumber#,
                #list[].prefix#,
                #list[].elementKey#,
                #list[].elementName#,
                #list[].postfix#,
                #list[].isRequired#,
                #list[].controlType#,
                #list[].controlLentgh#,
                #list[].isClassification#,
                #list[].classificationNo#,
                #list[].listDisplay#,
                #list[].defaultValue#,
                #list[].valueFormat#,
                #list[].valueMaxLentgh#,
                #list[].registerAvaliableMode#,
                #list[].applyAvaliableMode#,
                #list[].contractModifyAvaliableMode#,
                #list[].contentModifyAvaliableMode#,
                #list[].groupNumber#,
                #list[].isFixed#,
                #list[].fixedId#,
                #list[].isEnableFlg#,
                #list[].htmlContent#,
                #list[].htmlStyle#,
                #list[].htmlClass#,
                #list[].htmlSpan#,
                #list[].subtable#,
                SYSDATE,
                #list[].createrPerson#,
                #list[].updateDate#,
                #list[].updatePerson#           
            );
        </iterate>
    </insert> 

參考:

https://blog.csdn.net/chengnuo628/article/details/53814278

https://blog.csdn.net/qq525099302/article/details/43053291

https://blog.csdn.net/weixin_42442986/article/details/81479558

https://blog.csdn.net/fukaiit/article/details/80691665

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章