ORACLE insert 详解
多表 INSERT 语句概述
:: INSERT...SELECT 语句能够作为单个的 DML 语句的一部分用于插入行到多表中
:: 多表 INSERT 语句能够被用在数据仓库系统中从一个或多个操作源转移数据到一组目的表中
:: 下面的方法提供重要的性能改进:
- 单个 DML 与多 INSERT...SELECT 语句相对
- 单个 DML 与一个用 IF...THEN 语法做多插入的过程相对
Oracle9i 引入下面的多表插入语句的类型:
-- 无条件 ALL INSERT
-- Oracle 服务器执行每一个 insert_into_clause一次
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;
-- 有条件 ALL INSERT
-- Oracle 服务器通过相应的 WHEN 条件过滤每一个 insert_into_clause,确定是否执行这个 insert_into_clause,一个单个的多表插入语句可以包含最多 127 个 WHEN 子句
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;
-- 有条件 FIRST INSERT
-- Oracle 服务器对每一个出现在语句顺序中的 WHEN 子句求值;
-- 如果第一个 WHEN 子句的值为 true,Oracle 服务器对于给定的行执行相应的 INTO 子句,并且跳过后面的 WHEN 子句(后面的when语句都不再考虑满足第一个When子句的记录,即使该记录满足when语句中的条件)。
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;
--枢轴式(Pivoting) INSERT
--主要用于将非关系数据转换为关系型数据
INSERT ALL
INTO sales_info VALUES (employee_id,week_id,sales_MON)
INTO sales_info VALUES (employee_id,week_id,sales_TUE)
INTO sales_info VALUES (employee_id,week_id,sales_WED)
INTO sales_info VALUES (employee_id,week_id,sales_THUR)
INTO sales_info VALUES (employee_id,week_id,sales_FRI)
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE, sales_WED, sales_THUR,sales_FRI
FROM sales_source_data;
注:多表 INSERT 语句上的约束
a、只能在表而不能在视图上执行多表插入;
b、不能执行一个多表插入到一个远程表;
c、在执行一个多表插入时,不能指定一个表集合表达式;
d、在一个多表插入中,所有的 insert_into_clauses 不能组合指定多于 999 个目列;
e、只有当所有insert_into_clauses中的表数据都没有发生更新时,Rollback才会起作用。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21126685/viewspace-666774/ ,如需转载,请注明出处,否则将追究法律责任。