Oracle 批量插入數據 insert all into 用法


項目需要用到導入excel表,並解析數據批量插入到oracle數據庫中。

1)直接解析excel,循環行,拼了sql,executeUpdate。

執行一波…
咦,這效率很低啊,有多少行數據就執行了多少句sql,基本是一萬行已經接近一分鍾了。

2)每次都僅執行一條sql語句,時間是不是都花在建立連接放開連接balabala的過程上了,用executebatch批量執行sql語句試試。
沒有任何明顯的改善。

3)那改成一條insert語句效果怎么樣呢?

å¨è¿éæå¥å¾çæè¿°

 

å¨è¿éæå¥å¾çæè¿°

這回效果看起來很明顯了,問題看起來要解決了,確實,按這樣改到程序里,執行上傳excel,解析插入一萬行數據到數據庫,總共也就差不多一秒鍾,能接受了。

4)但是我還想兼容Oracle,剛才是拿MySql做的實驗,Oracle竟然不能這么寫:

  1. insert into testimport(username,password,address,telphone,email)
  2. values
  3. ( 'testname','jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd','XXX省XXX市','19876767856','fdsfdsfads@163.com'),
  4. ( 'testname','jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd','XXX省XXX市','19876767856','fdsfdsfads@164.com'),
  5. ( 'testname','jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd','XXX省XXX市','19876767856','fdsfdsfads@165.com')

那我們在Oracle中,怎么通過一個insert語句批量插入數據呢?

  1.   INSERT ALL 
  2.   INTO A(field_1,field_2) VALUES (value_1,value_2) 
  3.   INTO A(field_1,field_2) VALUES (value_3,value_4) 
  4.   INTO A(field_1,field_2) VALUES (value_5,value_6)
  5.   SELECT 1 FROM DUAL;

補充:評論里提到的為什么要加 SELECT 1 FROM DUAL?
官方例子:

  1.   INSERT ALL
  2.   INTO sales (prod_id, cust_id, time_id, amount)
  3. VALUES (product_id, customer_id, weekly_start_date, sales_sun)
  4. INTO sales (prod_id, cust_id, time_id, amount)
  5.   VALUES (product_id, customer_id, weekly_start_date+1, sales_mon)
  6. INTO sales (prod_id, cust_id, time_id, amount)
  7.   VALUES (product_id, customer_id, weekly_start_date+2, sales_tue)
  8.   INTO sales (prod_id, cust_id, time_id, amount)
  9.    。。。
  10. SELECT product_id, customer_id, weekly_start_date, sales_sun,
  11.  sales_mon, sales_tue, sales_wed, sales_thu, sales_fri, sales_sat
  12.   FROM sales_input_table;

個人理解:

“ALL into_clause: Specify ALL followed by multiple insert_into_clauses to perform an unconditional multitable insert. Oracle Database executes each insert_into_clause once for each row returned by the subquery.”

insert all into並不表示一個表中插入多條記錄,而是表示多表插入各一條記錄,而這多表可以是同一個表,就成了單表插入多條記錄。根據后面子查詢的結果,前面每條into語句執行一次,博客正文中value都是“字面量”,所以用select 1 from dual返回一條記錄即可。

參考地址:https://docs.oracle.com/database/121/SQLRF/statements_9015.htm#SQLRF01604

補充:

oracle問題:

SELECT 1 from dual的作用?

回答:

①. 這是oracle中自帶的一個虛擬表,用它來可以查看一些系統信息;比如系統時間 :select sysdate from dual;

②. dual是虛擬表,這句話的意思就是返回一個值,這里的值就是1

 

 

原文來自於:https://blog.csdn.net/AlbenXie/article/details/103383631


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM