oracle实现insert into 多个values

稍微熟悉Oracle的都知道,如果我们想一条SQL语句向表中插入多个值的话,如果如下语句

INSERT INTO 某表 VALUES(各个值),VALUES(各个值),.....;

这样会报错的,因为oracle是不支持这种写法的,如果多个INSERT INTO VALUEES(各个值);这样以“;”隔开一同执行也是不行的,oracle也是不支持的。

       不过MySQL这两种方式都是支持的。在MySQL中还可以使用如下格式的插入语句:

示例:
insert into persons 
(id_p, lastname , firstName, city )
values
(200,'haha' , 'deng' , 'shenzhen'),
(201,'haha2' , 'deng' , 'GD'),
(202,'haha3' , 'deng' , 'Beijing');

这样就批量插入数据了

 

       SQL Server也是不支持这两种写法的。

       然而,有时我们在开发过程中,如果是用的oracle数据库的话,有时很需要这种“INSERT INTO  某表” 一次性能插入多个值这样的功能,但oracle又不支持以上两种方式那么我们怎么办?是的可能你很机灵的想到了几种方法,如存储过程,或着INSERT INTO 某表 SELECT * FROM 某个表等,不过声明一下,我们在此不探讨这些方法,而且都有一定的局限性,有时我就要插入指定的几个值,而且一条SQL语句完成,存储过程的话,万不得已,建议大家不要使用,当然这个根据情况而定,可以读读这个博客存储过程的优缺点,分析的很详细。

       那么有没有其他方法呢?答案是肯定有的,也许熟悉oracle数据库的可能知道从oracle9i版本以后,可以使用一种方法即:

"INSERT ALL INTO  a表
VALUES(各个值)  
INTO a表 VALUES (其它值) 
INTO a表 VALUES(其它值) .... 再跟一个SELECT 语句"。

后边跟的SELECT 语句我们可以从虚拟表里查如 SELECT 1 FROM DUAL。注意后边跟的SELECT语句可以随意,不过不是把它SELECT出来的内容插入前边的表里,而是起到前边的多个数据每次插入多少行的作用,这个多少行是和后边跟的SELECT语句查出来几条而定的,如后边的跟的SELECT 语句查出了15条记录,那么前边的"INSERT ALL INTO  a表 VALUES(各个值1)  INTO a表 VALUES (其它值2) INTO a表 VALUES(其它值3)"就会先插入值1对应的各个字段插入15条记录,然后插入值2各个对应的字段15条记录,然后插入值3对应的各个字段15条记录,也就是说有点按列插入的意思。

       我们要的是批量插入多个VALUES这样的一条记录,所以后边的SELECT 语句只要能查出一条记录就行,建议大家后边用SELECT 1 FROM DUAL

       下边看一个例子,一目了然,一看就会用了:

示例脚本,表名b
insert
all into c##imp01.b values(1) into c##imp01.b values(2) into c##imp01.b values(3) into c##imp01.b values(4) select 1 from dual;

因为我的表里只有一个字段,所以就没有写出字段名来。

如果插入的不是全部字段,也可以使用下面的形式:

insert into sc(sno,cno) values('95020','1')

posted on 2017-09-01 14:58  djq002  阅读(11802)  评论(0编辑  收藏  举报

导航