ITPub博客

首页 > 数据库 > Oracle > 一个语句同时INSERT多个表

一个语句同时INSERT多个表

原创 Oracle 作者:flysky0814 时间:2007-11-09 09:09:53 0 删除 编辑

在以前的版本中,如果想插入多个表中,需要使用多条INSERT语句,9I开始可以用一条INSERT语句实现向多个表中插入数据.
INSERT [ALL] [conditional_insert_clause]
[insert_into_clause values_clause] (subquery)

其中conditional_insert_clause如下:
[ALL] [FIRST]
[WHEN condition THEN] [insert_into_clause values_clause]
[ELSE] [insert_into_clause values_clause]

上面的语法说明其实包含了两种情况
>无条件
>有条件,所以后面的conditional_insert_clasue里出现的[ALL]和INSERT后面的[ALL]是分属两种情形下的
举例就很容易理解了

无条件INSERT ALL
INSERT ALL
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID,hire_date HIREDATE,salary SAL,manager_id MGR
FROM employees
WHERE employee_id>200;
因为没有附加限制于检索出的记录,所以所有检索返回数据讲根据其列名插入相应的表中.

有条件的INSERT ALL
INSERT ALL
WHEN SAL>10000 THEN
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
WHEN MGR>200 THEN
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID,hire_date HIREDATE,salary SAL,manager_id MGR
FROM employees
WHERE employee_id>200;
这里就将比较了,返回记录将比较其SAL,如果大于10000则插入SAL_HISTORY,同理,MGR大于200的记录将插入MGR_HISTORY表.其余都将丢弃.

有条件的FIRST INSERT
FIRST与ALL的区别在于当遇到第一个求值为TRUE的子句之后停止对WHEN子句求值,而ALL不论是否求值为TRUE.
INSERT FIRST
WHEN SAL>25000 THEN
INTO special_sal VALUES(DEPTID,SAL)
WHEN HIREDATE like ('%00%') THEN
INTO hiredate_history_00 VALUES(DEPTID,HIREDATE)
WHEN HIREDATE like ('%99%') THEN
INTO hiredate_history_99 VALUES(DEPTID,HIREDATE)
ELSE
INTO hiredate_history VALUES(DEPTID,HIREDATE)
SELECT department_id DEPTID,SUM(salary) SAL,
MAX(hire_date) HIREDATE
FROM employees
GROUP BY department_id;
上例中如果第一个WHEN子句求值为TRUE则其后的WHEN子句将不会被执行,反之将直到遇到第一个满足条件的子句执行为止.

好像oracle的增删查改都可以同一语句操作多个表,9i以上的。不过不知能否在一个insert语句中同时加个update呢,呵呵 --瞎想的

注:本方法对于批量插入数据不可取,因为相当于用游标一样行级判断后操作.

[@more@]

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

上一篇: 关于NO_DATA_FOUND
请登录后发表评论 登录
全部评论

注册时间:2008-03-31

  • 博文量
    53
  • 访问量
    382392