循環插入太耽誤時間,業務需要批量新增數據,網上大概有說了四種方法。
#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