Oracle使用虛擬表dual一次插入多條記錄


從一個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 

  


免責聲明!

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



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