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

猜你喜欢

转载自blog.csdn.net/howroad/article/details/89673611