稍微熟悉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

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

insert into values 冒号 insert into value和values_oracle

        OK了,我们实现了没用存储过程用一条SQL语句完成了向oracle的表中插入多个指定的值。也许你会问这有啥用处,告诉你,如果你在一定情况下用到它,作用就大了,避免了写复杂而又没必要写的存储过程,避免了执行多个SQL语句多次连接数据库的开销,当你知道了学到了,遇到问题用的时候就会明白了,不过鄙人不才,对数据库了解不深,如果你觉得说的没有道理或者你有更好的点子或者方法,非常欢迎留言交流,以便您,我,还有大家,共同的学习与成长!

 


对于以上方法本人亲测如下:

环境:
PL/SQL Developer Version 9.0.0.1601
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

测试用表:jack_20170206_aa



insert all 
 into jack_20170206_aa values('4014033')
 into jack_20170206_aa values('4065304')
 into jack_20170206_aa values('4088136')
 into jack_20170206_aa values('4092405')
select 1 from dual;



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

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

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