Oracle使用虚拟表dual一次插入多条记录

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

处理虚表插入多条是用序列进行插入报错的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
第一种方法
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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值