項目需要用到導入excel表,並解析數據批量插入到oracle數據庫中。
1)直接解析excel,循環行,拼了sql,executeUpdate。
執行一波…
咦,這效率很低啊,有多少行數據就執行了多少句sql,基本是一萬行已經接近一分鍾了。
2)每次都僅執行一條sql語句,時間是不是都花在建立連接放開連接balabala的過程上了,用executebatch批量執行sql語句試試。
沒有任何明顯的改善。
3)那改成一條insert語句效果怎么樣呢?


這回效果看起來很明顯了,問題看起來要解決了,確實,按這樣改到程序里,執行上傳excel,解析插入一萬行數據到數據庫,總共也就差不多一秒鍾,能接受了。
4)但是我還想兼容Oracle,剛才是拿MySql做的實驗,Oracle竟然不能這么寫:
-
insert into testimport(username,password,address,telphone,email)
-
values
-
( 'testname','jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd','XXX省XXX市','19876767856','fdsfdsfads@163.com'),
-
( 'testname','jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd','XXX省XXX市','19876767856','fdsfdsfads@164.com'),
-
( 'testname','jfksdfkdsfjksadljfkdsfjsdlafjdaslkfjasfd','XXX省XXX市','19876767856','fdsfdsfads@165.com')
那我們在Oracle中,怎么通過一個insert語句批量插入數據呢?
-
INSERT ALL
-
INTO A(field_1,field_2) VALUES (value_1,value_2)
-
INTO A(field_1,field_2) VALUES (value_3,value_4)
-
INTO A(field_1,field_2) VALUES (value_5,value_6)
-
SELECT 1 FROM DUAL;
補充:評論里提到的為什么要加 SELECT 1 FROM DUAL?
官方例子:
-
INSERT ALL
-
INTO sales (prod_id, cust_id, time_id, amount)
-
VALUES (product_id, customer_id, weekly_start_date, sales_sun)
-
INTO sales (prod_id, cust_id, time_id, amount)
-
VALUES (product_id, customer_id, weekly_start_date+1, sales_mon)
-
INTO sales (prod_id, cust_id, time_id, amount)
-
VALUES (product_id, customer_id, weekly_start_date+2, sales_tue)
-
INTO sales (prod_id, cust_id, time_id, amount)
-
。。。
-
SELECT product_id, customer_id, weekly_start_date, sales_sun,
-
sales_mon, sales_tue, sales_wed, sales_thu, sales_fri, sales_sat
-
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
