다중 테이블 INSERT
여러개의 테이블에 멀티 로우를 삽입할 때 사용한다.
구문
1 2 3 4 5 6 7 8 | INSERT ALL | FIRST WHEN 조건1 THEN INTO [스키마].테이블명(컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...) WHEN 조건2 THEN INTO [스키마].테이블명(컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...) ... ELSE INTO [스키마].테이블명(컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...) SELECT 문; | cs |
ALL
디폴트 값. 이후 WHEN 조건절을 명시했을 때, 각 조건이 맞으면 INSERT를 모두 수행하라는 의미
FIRST
이후 WHEN 절 조건식에 따른 INSERT 문을 수행할 때, 서브 쿼리로 반환된 로우에 대해 조건이 참인 WHEN 절을 만나면 해당 INSERT문을 수행하고 나머지에 대해서는 조건 평가를 하지 않고 종료.
WHEN 조건 THEN ... ELSE
특정 조건에 따라 INSERT를 수행할 때 해당 조건을 명시
SELECT 문
다중 테이블 INSERT 구문에서는 반드시 서브쿼리가 동반되어야하며, 서브쿼리의 결과를 조건에 따라 평가해 데이터를 INSERT한다.
예제
1. 샘플 테이블을 만든다.
1 2 3 4 5 6 7 8 9 10 | CREATE TABLE EX7_3 ( EMP_ID NUMBER ,EMP_NAME VARCHAR2(100) ); CREATE TABLE EX7_4 ( EMP_ID NUMBER ,EMP_NAME VARCHAR2(100) ); | cs |
2. 기존의 단일 테이블 INSERT 방법
1 2 | INSERT INTO EX7_3 VALUES ( 101, '홍길동'); INSERT INTO EX7_3 VALUES ( 102, '김유신'); | cs |
3. 다중 테이블 INSERT
1 2 3 4 5 | INSERT ALL INTO EX7_3 VALUES (103, '강감찬') INTO EX7_3 VALUES (104, '연개소문') SELECT * FROM DUAL; | cs |
1 2 3 4 5 | INSERT ALL INTO EX7_3 VALUES (105, '가나다') INTO EX7_4 VALUES (105, '마바사') SELECT * FROM DUAL; | cs |
4. 테이블을 비운다.
1 2 | TRUNCATE TABLE EX7_3; TRUNCATE TABLE EX7_4; | cs |
5. 심화
1 2 3 4 5 6 7 8 9 | INSERT ALL WHEN DEPARTMENT_ID = 30 THEN INTO EX7_3 VALUES (EMPLOYEE_ID, EMP_NAME) WHEN DEPARTMENT_ID = 90 THEN INTO EX7_4 VALUES (EMPLOYEE_ID, EMP_NAME) SELECT DEPARTMENT_ID , EMPLOYEE_ID , EMP_NAME FROM EMPLOYEES; | cs |
만약 FIRST를 명시했다면, 첫번째로 조건 값이 TRUE가 될 때 해당 로우가 입력되고 끝난다.
만약 그 다음 WHEN 조건 결과가 TRUE가 되더라도 이미 이전 단계에서 입력이 되었기 때문에, 그 로우는 추가로 입력되지 않는다.
6. 사번이 116번보다 작은 사원은 EX7_3에, 급여가 5000보다 작은 사원은 EX7_4에 넣는다.
1 2 3 4 5 6 7 8 9 10 11 | INSERT ALL WHEN EMPLOYEE_ID < 116 THEN INTO EX7_3 VALUES (EMPLOYEE_ID, EMP_NAME) WHEN SALARY < 5000 THEN INTO EX7_4 VALUES (EMPLOYEE_ID, EMP_NAME) SELECT DEPARTMENT_ID , EMPLOYEE_ID , EMP_NAME , SALARY FROM EMPLOYEES WHERE DEPARTMENT_ID = 30; | cs |
SELECT 문으로 테이블을 확인해보면 아래와 같이 출력된다.
[EX7_3]
[EX7_4]
EMP_ID가 115인 Alexander Khoo를 둘 중 한 테이블에만 넣으려면?
7. FIRST를 이용한다.
1 2 3 4 5 6 7 8 9 10 11 | INSERT FIRST WHEN EMPLOYEE_ID < 116 THEN INTO EX7_3 VALUES (EMPLOYEE_ID, EMP_NAME) WHEN SALARY < 5000 THEN INTO EX7_4 VALUES (EMPLOYEE_ID, EMP_NAME) SELECT DEPARTMENT_ID , EMPLOYEE_ID , EMP_NAME , SALARY FROM EMPLOYEES WHERE DEPARTMENT_ID = 30; | cs |
[EX7_3]
[EX7_4]
FIRST 를 사용했기 때문에, 첫번째 WHEN 조건을 충족한 행은 두번째 WHEN 조건을 검사하지 않고 넘어간다.
반응형
'📃 DATABASE > ORACLE' 카테고리의 다른 글
[PL/SQL] IF문 / CASE문 (0) | 2018.01.21 |
---|---|
[PL/SQL] PL/SQL 기초 (0) | 2018.01.17 |
[SQL] WINDOW 함수 (0) | 2018.01.16 |
[SQL] 분석 함수 (0) | 2018.01.15 |
[SQL] WITH절과 순환 서브쿼리 (0) | 2018.01.15 |