--以下sql 在oracle 中都不支持,执行直接报错
insert into uniq_test_01 values(1,'a');insert into uniq_test_01 values(2,'b');insert into uniq_test_01 values(3,'c');
insert into uniq_test_01 values(1,'a'), values(2,'b'), values(3,'c'); ---->> mysql 中执行,但在oracle 不执行
在Oracle如果想一条SQL语句向表中插入多个值的话,如果如下语句:
INSERT INTO 某表 VALUES(各个值),VALUES(各个值),.....;
oracle中会报错的,因为oracle是不支持这种写法的,如果多个INSERT INTO VALUEES(各个值);这样以";"隔开一同执行也是不行的,oracle也是不支持的。
在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。
最终实现了不用存储过程用一条SQL语句完成了向oracle的表中插入多个指定的值。
测试用表:test_01
drop table test_01 purge ;
create table test_01(id number ,name varchar2(20));
insert into test_01 values(1,'a');
insert into test_01 values(2,'b');
insert into test_01 values(3,'c');
insert into test_01 values(4,'d');
commit;
--检查数据
SQL> select * from test_01 ;
ID NAME
---------- ------------------------------------------------------------
1 a
2 b
3 c
4 d
使用一条sql语句插入多条记录
insert all
into test_01 values(1,'a')
into test_01 values(2,'b')
into test_01 values(3,'c')
into test_01 values(4,'d')
select 1 from dual;
commit ;
--检查数据
SQL> select * from test_01 ;
ID NAME
---------- ------------------------------------------------------------
1 a
2 b
3 c
4 d
1 a
2 b
3 c
4 d
8 rows selected.
SQL> select count(*) from test_01 where id=1 ;
COUNT(*)
----------
2
一次多插入几条数据(insert all 里的每个into 都会被重复执行多次 )
insert all
into test_01 values(1,'a')
into test_01 values(2,'b')
into test_01 values(3,'c')
into test_01 values(4,'d')
select 1 from dba_objects where rownum<=8;
commit ;
--检查数据
SQL> select * from test_01 ;
ID NAME
---------- ------------------------------------------------------------
1 a
2 b
3 c
4 d
1 a
2 b
3 c
4 d
1 a
1 a
1 a
1 a
1 a
1 a
1 a
1 a
2 b
2 b
2 b
2 b
2 b
2 b
2 b
2 b
3 c
3 c
3 c
3 c
3 c
3 c
3 c
3 c
4 d
4 d
4 d
4 d
4 d
4 d
4 d
4 d
40 rows selected.
SQL> select count(*) from test_01 where id=1 ;
COUNT(*)
----------
10
如果使用存储过程
begin
into test_01 values(1,'a') ;
into test_01 values(2,'b') ;
into test_01 values(3,'c') ;
into test_01 values(4,'d') ;
end ;
/