2.2. Conditional INSERT ALL
Conditional INSERT ALL을 사용하면 특정 조건에 맞는 행만 원하는 테이블에 입력할 수 있습니다.
서브쿼리로의 결과 행을 WHEN … THEN 절에서 체크한 후 조건에 맞는 절에 기술된 테이블에 INSERT 작업을 수행합니다.
-- Conditional INSERT ALL Syntax
INSERT ALL
WHEN 조건절  1 THEN
      INTO [테이블  1] VALUES (컬럼  1,컬럼  2,...) 
WHEN 조건절  2 THEN
      INTO [테이블  2] VALUES (컬럼  1,컬럼  2,...)
........ 
ELSE
     INTO [테이블  3] VALUES (컬럼  1,컬럼  2,...) 
Subquery;
아래는 부서 별로 연봉인상율을 다르게 하여 각각의 테이블에 입력하는 예제입니다.
-- 테스트용 테이블 emp_dept10, emp_dept20, emp_dept30 을 생성합니다.
DROP TABLE emp_dept10;
DROP TABLE emp_dept20;
DROP TABLE emp_dept30;
CREATE TABLE emp_dept10 AS SELECT deptno, empno, ename, job, sal FROM emp WHERE 1=2;
CREATE TABLE emp_dept20 AS SELECT deptno, empno, ename, job, sal FROM emp WHERE 1=2;
CREATE TABLE emp_dept30 AS SELECT deptno, empno, ename, job, sal FROM emp WHERE 1=2;
-- 테이블이 정상적으로 생성되었는지 확인해 봅니다.
SELECT * FROM emp_dept10;
SELECT * FROM emp_dept20;
SELECT * FROM emp_dept30;
-- 부서별로 연봉인상율을 다르게 하여 각각의 테이블에 입력하는 예제입니다.
-- deptno=10 부서는 10%인상하여 emp_dept10 테이블에 INSERT
-- deptno=20 부서는 20%인상하여 emp_dept20 테이블에 INSERT
-- deptno=30 부서는 30%인상하여 emp_dept30 테이블에 INSERT
INSERT ALL
WHEN deptno=10 THEN
            INTO emp_dept10
            VALUES(deptno, empno, ename, job, ROUND(sal*1.1))
WHEN deptno=20 THEN
            INTO emp_dept20
            VALUES(deptno, empno, ename, job, ROUND(sal*1.2))
WHEN deptno=30 THEN
            INTO emp_dept30
            VALUES(deptno, empno, ename, job, ROUND(sal*1.3))
SELECT deptno, empno, ename, job, sal
     FROM emp;
 
-- 테이블에 데이터가 정상적으로 등록 되었는지 확인해 봅니다.
SQL> SELECT d.deptno, d.sal "10%_UP_SALARY", e.sal "ORIGINAL_SALARY"
     FROM emp_dept10 d, emp e
  WHERE d.empno = e.empno;
 
          DEPTNO     10%_UP_SALARY    ORIGINAL_SALARY
--------------------     -----------------------   -------------------------
                     10	                         2695                          2450
                     10                          5500                          5000
                     10	                         1430                          1300
3 rows selected.
SQL> SELECT d.deptno, d.sal "20%_UP_SALARY", e.sal "ORIGINAL_SALARY"
     FROM emp_dept20 d, emp e
  WHERE d.empno = e.empno;
          DEPTNO     20%_UP_SALARY    ORIGINAL_SALARY
--------------------     -----------------------   -------------------------
                     20	                           960	                       800
                     20	                         3570	                     2975
                     20	                         3600	                     3000
                     20	                         1320 	                     1100
                     20	                         3600	                     3000
5 rows selected.
SQL> SELECT d.deptno, d.sal "30%_UP_SALARY", e.sal "ORIGINAL_SALARY"
     FROM emp_dept30 d, emp e
  WHERE d.empno = e.empno;
          DEPTNO     30%_UP_SALARY    ORIGINAL_SALARY
--------------------     -----------------------   -------------------------
                    30	                         2080                          1600
                    30	                         1625	                     1250
                    30	                         1625	                     1250
                    30	                         3705	                     2850
                    30	                         1950	                     1500
                    30                           1235	                       950
6 rows selected.
아래는 조건에 사용하는 컬럼을 다르게 하여 각각의 테이블에 입력하는 예제입니다.
두 조건을 모두 만족하는 7900 JAMES 는 첫번째 조건을 만족하므로 emp_empno 테이블에 입력되었고, 두번째 조건 또한 만족하므로 emp_empno 테이블에도 입력이 됩니다.
-- 테스트용 테이블 emp_empno , emp_salary을 생성합니다.
DROP TABLE emp_empno;
DROP TABLE emp_sal;
CREATE TABLE emp_empno AS SELECT empno, ename, job, sal, deptno FROM emp WHERE 1=2;
CREATE TABLE emp_sal AS SELECT empno, ename, job, sal, deptno FROM emp WHERE 1=2;
-- 테이블이 정상적으로 생성되었는지 확인해 봅니다.
SELECT * FROM emp_empno;
SELECT * FROM emp_sal;
-- empno >= 7876 인 사원은 emp_empno 테이블에 INSERT
-- sal <= 1000 인 사원은 emp_sal 테이블에 INSERT
INSERT ALL
 WHEN empno >= 7876 THEN
             INTO emp_empno
             VALUES(empno, ename, job, sal, deptno)
 WHEN sal <= 1000 THEN
             INTO emp_sal
             VALUES(empno, ename, job, sal, deptno)
SELECT empno, ename, job, sal, deptno
    FROM emp;
-- emp_empno 테이블에 데이터가(empno >= 7876) 정상적으로 등록 되었는지 확인해 봅니다.
SQL> SELECT * FROM emp_empno;
       EMPNO   ENAME       JOB                       SAL       DEPTNO
----------------  -------------   -------------    -------------  ---------------
            7876   ADAMS      CLERK	            1100	           20
            7900   JAMES       CLERK	              950	           30
            7902   FORD         ANALYST	            3000                 20
            7934   MILLER      CLERK	            1300                 10
4 rows selected.
-- emp_sal 테이블에 데이터가(sal <= 1000) 정상적으로 등록 되었는지 확인해 봅니다.
SQL> SELECT * FROM emp_sal;
       EMPNO   ENAME       JOB                       SAL       DEPTNO
----------------  -------------   -------------    -------------  ---------------
            7369   SMITH        CLERK                   800                 20
            7900   JAMES        CLERK                   950                 30
2 rows selected.
				
								

