使用InsertSelect实现同时向多个表插入记录
一、无条件INSERTALL
---------------------------------------------------------------------------------------------
INSERTALL
insert_into_clausevalues_clause_1
[insert_into_clausevalues_clause_2]
……
Subquery;
----------------------------------------------------------------------------------------------
1、指定所有跟随着的多表insert_into_clauses执行无条件的多表插入;
2、对于每个由子查询返回的行,Oracle服务器执行每一个insert_into_clause一次。
二、条件INSERTALL
---------------------------------------------------------------------------------------------
INSERTALL
WHENconditionTHENinsert_into_clausevalues_clause
[WHENconditionTHEN][insert_into_clausevalues_clause]
……
[ELSE][insert_into_clausevalues_clause]
Subquery;
--------------------------------------------------------------------------------------------
1、指定conditional_insert_clause来执行一个条件多表插入;
2、Oracle服务器通过相应的WHEN条件过滤每一个insert_into_clause,确定是否执行这个insert_into_clause;
3、一个单个的多表插入语句可以包含最多127个WHEN子句。
三、条件INSERTFIRST
--------------------------------------------------------------------------------------------
INSERTFIRST
WHENconditionTHENinsert_into_clausevalues_clause
[WHENconditionTHEN][insert_into_clausevalues_clause]
……
[ELSE][insert_into_clausevalues_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(idint,namevarchar2(10));
z_test1(idint,namevarchar2(10));
z_test2(idint);
z_test3(namevarchar2(10);
初始数据:z_test
IdName
10133
5184
118423
118445
118467
6129
212923
212945
z_test1,z_test2,z_test3均为空。
测试一:无条件INSERTALL
SQL语句:
----------------------------------------------------------------------------
SQL>InsertAll
2Intoz_test1(id,name)values(id,name)
3Intoz_test2(id)values(id)
4Selectid,namefromz_test;
16rowscreated.
----------------------------------------------------------------------------
测试结果:
----------------------------------------------------------------------------
SQL>select*fromz_test1;
IDNAME
------------------------------
10133
5184
118423
118445
118467
6129
212923
212945
8rowsselected.
SQL>select*fromz_test2;
ID
----------
10
5
1
1
1
6
2
2
8rowsselected.
----------------------------------------------------------------------------
测试二:条件INSERTALL
SQL语句:
----------------------------------------------------------------------------
SQL>InsertAll
2whenid>5thenintoz_test1(id,name)values(id,name)
3whenid<>2thenintoz_test2(id)values(id)
4elseintoz_test3values(name)
5selectid,namefromz_test;
10rowscreated.
----------------------------------------------------------------------------
测试结果:
----------------------------------------------------------------------------
SQL>select*fromz_test1;
IDNAME
------------------------------
10133
6129
SQL>select*fromz_test2;
ID
----------
10
5
1
1
1
6
6rowsselected.
SQL>select*fromz_test3;
NAME
--------------------
12923
12945
2rowsselected.
----------------------------------------------------------------------------
测试三:条件INSERTFIRST
SQL语句:
----------------------------------------------------------------------------
SQL>InsertFirst
2whenid=1thenintoz_test1values(id,name)
3whenid>5thenintoz_test2values(id)
4elseintoz_test3values(name)
5select*fromz_test;
8rowscreated.
----------------------------------------------------------------------------
测试结果:
----------------------------------------------------------------------------
SQL>select*fromz_test1;
IDNAME
------------------------------
118423
118445
118467
3rowscreated.
SQL>select*fromz_test2;
ID
----------
10
6
2rowscreated.
SQL>select*fromz_test3;
NAME
--------------------
184
12923
12945
3rowscreated.
使用Insert Select实现同时向多个表插入记录
最新推荐文章于 2024-02-24 00:39:22 发布