玉祥平台客服-15087858732

标题: Oracle使用虚拟表dual一次插入多条记录 [打印本页]

作者: 张兴康    时间: 2020-7-5 13:43
标题: Oracle使用虚拟表dual一次插入多条记录
在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分钟。

处理虚表插入多条是用序列进行插入报错的问题
第一种方法
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


作者: 张兴康    时间: 2020-7-5 13:44

作者: fteair    时间: 2020-7-5 14:46

作者: caixuqad    时间: 2020-7-5 18:04

作者: caixuqad    时间: 2020-7-6 17:54

作者: caixuqad    时间: 2020-7-7 17:40

作者: 张兴康    时间: 2020-7-8 18:29
caixuqad 发表于 2017-9-7 17:40



作者: caixuqad    时间: 2020-7-15 16:57

作者: 张兴康    时间: 2020-7-15 17:53

作者: caixuqad    时间: 2020-7-18 17:59





欢迎光临 玉祥平台客服-15087858732 (http://plat.delit.cn/) Powered by Discuz! X3.2