[转]关于INSERT ALL和INSERT FIRST

一、无条件 INSERT ALL
二、条件 INSERT ALL
三、条件 INSERT FIRST[@more@] Insert…Select

使用Insert Select实现同时向多个表插入记录

2007
/ 06 / 25

一、无条件 INSERT ALL
---------------------------------------------------------------------------------------------
INSERT ALL

insert_into_clause values_clause_1
[ insert_into_clause values_clause_2 ]
……

Subquery;
---------------------------------------------------------------------------------------------- 1、指定所有跟随着的多表 insert_into_clauses 执行无条件的多表插入;

2、对于每个由子查询返回的行, Oracle 服务器执行每一个 insert_into_clause一次。



二、条件 INSERT ALL
---------------------------------------------------------------------------------------------
INSERT ALL

WHEN condition THEN insert_into_clause values_clause
[ WHEN condition THEN ] [ insert_into_clause values_clause ]
……
[ELSE] [ insert_into_clause values_clause ]
Subquery;
--------------------------------------------------------------------------------------------
1、指定 conditional_insert_clause 来执行一个条件多表插入;

2、Oracle 服务器通过相应的 WHEN 条件过滤每一个 insert_into_clause,确定是否执行这个 insert_into_clause;

3、一个单个的多表插入语句可以包含最多 127 个 WHEN 子句。



三、条件 INSERT FIRST
--------------------------------------------------------------------------------------------
INSERT FIRST

WHEN condition THEN insert_into_clause values_clause
[ WHEN condition THEN ] [ insert_into_clause values_clause ]
……
[ELSE] [ insert_into_clause values_clause ]
Subquery;
--------------------------------------------------------------------------------------------
1、Oracle 服务器对每一个出现在语句顺序中的 WHEN 子句求值;

2、如果第一个 WHEN 子句的值为 true,Oracle 服务器对于给定的行执行相应的 INTO 子句,并且跳过后面的 WHEN 子句
( 后面的when语句都不再考虑满足第一个When子句的记录,即使该记录满足when语句中的条件 )



注:多表 INSERT 语句上的约束

a、你只能在表而不能在视图上执行多表插入;

b、你不能执行一个多表插入到一个远程表;

c、在执行一个多表插入时,你不能指定一个表集合表达式;

d、在一个多表插入中,所有的 insert_into_clauses 不能组合指定多于 999 个目列;

e、只有当所有insert_into_clauses中的表数据都没有发生更新时,Rollback才会起作用。



EG
:

Tables : z_test ( id int , name varchar2 ( 10 ));

z_test1 ( id int , name varchar2 ( 10 ));

z_test2 ( id int );

z_test3 ( name varchar2 ( 10 );
初始数据:z_test

Id Name

10 133

5 184

1 18423

1 18445

1 18467

6 129

2 12923

2 12945

z_test1
, z_test2 , z_test3均为空。



测试一:无条件 INSERT ALL

SQL 语句:
----------------------------------------------------------------------------
SQL > Insert All

2 Into z_test1
( id , name ) values ( id , name )

3 Into z_test2 ( id ) values ( id )

4 Select id , name from z_test ;


16 rows created .

----------------------------------------------------------------------------
测试结果:
----------------------------------------------------------------------------
SQL > select * from z_test1 ;



ID NAME
---------- --------------------

10 133

5 184

1 18423

1 18445

1 18467

6 129

2 12923

2 12945



8 rows selected
.


SQL > select * from z_test2 ;



ID
----------

10

5

1

1

1

6

2

2



8 rows selected
.

----------------------------------------------------------------------------


测试二:条件 INSERT ALL

SQL 语句:
----------------------------------------------------------------------------
SQL > Insert All

2 when id
> 5 then into z_test1 ( id , name ) values ( id , name )

3 when id <> 2 then into z_test2 ( id ) values ( id )

4 else into z_test3 values ( name )

5 select id , name from z_test ;


10 rows created .

----------------------------------------------------------------------------
测试结果:
----------------------------------------------------------------------------
SQL > select * from z_test1 ;



ID NAME
---------- --------------------

10 133

6 129



SQL
> select * from z_test2 ;



ID
----------

10

5

1

1

1

6



6 rows selected
.


SQL > select * from z_test3 ;


NAME
--------------------
12923

12945



2 rows selected
.

----------------------------------------------------------------------------


测试三:条件 INSERT FIRST

SQL 语句:
----------------------------------------------------------------------------
SQL > Insert First

2 when id
= 1 then into z_test1 values ( id , name )

3 when id > 5 then into z_test2 values ( id )

4 else into z_test3 values ( name )

5 select * from z_test ;


8 rows created .

----------------------------------------------------------------------------
测试结果:
----------------------------------------------------------------------------
SQL > select * from z_test1 ;



ID NAME
---------- --------------------

1 18423

1 18445

1 18467



3 rows created
.


SQL > select * from z_test2 ;



ID
----------

10

6



2 rows created
.


SQL > select * from z_test3 ;


NAME
--------------------
184

12923

12945



3 rows created
.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/594892/viewspace-972271/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/594892/viewspace-972271/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值