循环插入太耽误时间,业务需要批量新增数据,网上大概有说了四种方法。
#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