Oracle Advanced SQL 강좌
Unconditional INSERT ALL 1 2 99,999+

by 구루비 Multitable INSERT INSERT ALL Unconditional INSERT ALL [2014.02.19]


Unconditional INSERT ALL

Unconditional INSERT ALL은 하나의 INSERT문으로 여러 개의 테이블에 데이터를 입력할 수 있다.

INTO 절과 VALUES 절에 기술한 컬럼의 개수와 데이터 타입은 동일해야 한다.

1
2
3
4
5
6
-- Unconditional INSERT ALL Syntax
INSERT ALL
  [INTO 테이블1 VALUES (컬럼1,컬럼2,...)]
  [INTO 테이블2 VALUES (컬럼1,컬럼2,...)]
  .......
Subquery;

직접 실습을 하면서 이해해보자. 아래 예제는 emp 테이블의 데이터를 emp_ename테이블과 emp_deptno 테이블에 INSERT ALL을 사용하여 동시에 INSERT 하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
-- scott 계정에서 emp 테이블을 이용하여 실습하였다.
SQLPLUS scott/tiger
 
 
-- 테스트용 테이블 emp_ename과 emp_deptno를 생성하자
-- empno, ename, sal 컬럼을 가지는 emp_ename 테이블 생성
CREATE TABLE emp_ename
    AS
SELECT empno, ename, sal
  FROM emp
 WHERE 1=2;
 
-- empno, deptno, job 컬럼을 가지는 emp_deptno 테이블 생성
CREATE TABLE emp_deptno
    AS
SELECT empno, deptno, job
  FROM emp
 WHERE 1=2;
 
 
-- 테이블이 정상적으로 생성되었는지 확인해 보자
SELECT * FROM emp_ename;
SELECT * FROM emp_deptno;
 
 
 
--INSERT ALL을 이용하여 emp_ename, emp_deptno 테이블에 INSERT를 해보자
INSERT ALL
  INTO emp_ename VALUES (empno, ename, sal)
  INTO emp_deptno (empno, deptno, job) VALUES (empno, deptno, job)
SELECT empno, ename, sal, deptno, job
  FROM emp
 WHERE sal >= 2900;
 
 
 
-- 데이터가 정상적으로 삽입되었는지 확인해 보자
-- sal >= 2900 조건을 만족하는 4건이 emp_ename, emp_deptno 테이블에
-- INSERT 된것을 확인 할 수 있다.
SELECT * FROM emp_ename;
SELECT * FROM emp_deptno;
 
 
-- 테스트 테이블은 삭제 한다.
DROP TABLE emp_ename;
DROP TABLE emp_deptno;

Conditional INSERT ALL

Conditional INSERT ALL을 사용하면 특정 조건에 맞는 행만 원하는 테이블에 입력할 수 있다.

서브쿼리로의 결과 행을 WHEN ... THEN절에서 체크한 후 조건에 맞는 절에 기술된 테이블에 INSERT 작업을 수행한다.

1
2
3
4
5
6
7
8
9
10
11
-- 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;

직접 실습을 하면서 이해해보자. 아래는 부서별로 연봉인상율을 다르게 하여 각각의 테이블에 입력하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
-- 테스트용 테이블 emp_dept10, emp_dept20, emp_dept30을 생성한다.
CREATE TABLE emp_dept10 AS SELECT empno, ename, job, sal FROM emp WHERE 1=2;
CREATE TABLE emp_dept20 AS SELECT empno, ename, job, sal FROM emp WHERE 1=2;
CREATE TABLE emp_dept30 AS SELECT 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(empno, ename, job, ROUND(sal*1.1))
 WHEN deptno=20 THEN
      INTO emp_dept20
      VALUES(empno, ename, job, ROUND(sal*1.2))
 WHEN deptno=30 THEN
      INTO emp_dept30
      VALUES(empno, ename, job, ROUND(sal*1.3))
SELECT deptno, empno, ename, job, sal
  FROM emp;
 
 
-- emp_dept10 테이블에 데이터가 정상적으로 등록 되었는지 확인해 보자
-- emp_dept20, emp_dept30 테이블도 테이블명만 변경하여 확인해 보세요
SELECT d.sal "인상급여", e.sal "원급여"
  FROM emp_dept10 d, emp e
 WHERE d.empno = e.empno;
   
 
 
-- 테스트 테이블은 삭제 한다.
DROP TABLE emp_dept10;
DROP TABLE emp_dept20;
DROP TABLE emp_dept30;

- 강좌 URL : http://www.gurubee.net/lecture/2688

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 더블엑스 [2014.03.13 14:08:05]

아래 게시물 'Conditional INSERT ALL'과 중복되는 내용이 포함되어 있네요.



by 박민철 [2014.08.28 17:04:27]

INSERT ALL 참 좋은 SQL이네요...

활용하면 비즈니스 로직 줄 일 수 있을듯 ㅎㅎ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입