從一個CSV文件中讀取所有的數據,並且插入到一個Oracle數據庫中,並且幾分鍾內完成,大約有60萬條。
網上有人說了,你可以循環insert然后插入幾千條以后Commit一次,我靠,你自己試試看!!如果沒試過就不要誤導別人好吧。
還有人說了,Oracle根本不支持一次多條插入,我靠,你咋不說自己學藝不精呢?
現在給大家介紹一個小技巧,話說在Oracle里有一個很奇特的“表”,名叫Dual。我們就要利用這個Dual來做文章,
首先,你知道 select '1' from dual 是啥結果嗎? 對了,結果就是返回1。
其次,你知道
select '1' from dual
union all
select '2' from dual
是啥結果嗎? 對鳥,結果是
1
2
那么,最關鍵的地方來了,
insert into 表名 (字段1)
select '1' from dual
union all
select '2' from dual
那么這一次就插入了兩條數據。當然,如果全字段插入 那個(字段1)還可以省略掉。
下面一個具體例子:
insert into doc_data (code,id,value,state)
select '13','川A','成都市公安局交通警察支隊車輛管理所',0 from dual
union all select '13','川B','綿陽市公安局交通警察支隊車輛管理所',0 from dual
union all select '13','川C','自貢市公安局交通警察支隊車輛管理所',0 from dual
union all select '13','川D','攀枝花市公安局交通警察支隊車輛管理所',0 from dual
最后的實踐證明,如果循環60萬次Insert,一個小時也執行不完(當然有可能是機器太爛),而拼成1000條Select再插入一次,插入60萬條的時間是20分鍾,而拼成5000條Select再Insert一次,插入60萬條數據的時間是12分鍾。
祝你好運。
轉載:http://www.cnblogs.com/huangzhen/archive/2011/12/04/2275429.html
處理虛表插入多條是用序列進行插入報錯的問題
第一種方法 create or replace function get_seq (p_in_sqname in varchar2) return number is l_res number ; begin execute immediate 'select '|| p_in_sqname|| '.nextval from dual' into l_res ; return l_res ; end ; insert into t_fms_dictionary(id,dic_key,dic_lang,DIC_UPDATABLE,DIC_VALUE) select get_seq('seq_dictionary_id'), '1','1' ,'1' ,'1' from dual union all select get_seq('seq_dictionary_id') , '2','2','2','2' from dual union all select get_seq('seq_dictionary_id') , '3','3','3','3' from dual 第二種方法: insert into t_fms_dictionary(id,dic_key,dic_lang,DIC_UPDATABLE,DIC_VALUE) select get_seq('seq_dictionary_id'),A.* from ( select '1','1' ,'1' ,'1' from dual union all select '2','2','2','2' from dual union all select '3','3','3','3' from dual) A