본문 바로가기

Paul Work/Sql

○ DML 확장

○ DML 확장
inline view : from 에 있는 subquery

1) Explicit Default
create table t1 (no number, loc varchar2(10) default 'SEOUL');

1. insert into t1 values(100); 
   -> ORA-00947 : not enough values
: 컬럼이 두개인데 하나의 컬럼에만 값이 들어갔기 때문에 error

2. Implicit Default
insert into t1(no) values(100);

3. Explicit Default
insert into t1(no loc) values(100, default); 

-> 2,3번 둘다 같은 값이 들어가지만 구문을 보고 이해 할 수 있도록 해야 하므로 Explicit Default를 사용하는 것이 좋다.

 

2) Multitable INSERT

1. 정의
① table을 읽는 시간이 줄어든다.
② 1번의 DML로 여러 row를 insert할 수 있다.

2. Multitable Insert 방법
① Unconditional INSERT ALL
② Conditional ALL INSERT
③ Conditional FIRST INSERT
④ Pivoting INSERT

3. Unconditional INSERT ALL
① 컬럼을 선별적으로 골라서 넣을 수 있다.
② 검색한 table의 컬럼의 수와 넣으려는 table의 컬럼의 수가 달라도 상관 없다.
③ example

 create table emp1(empno, hiredate, sal);
 create table emp2(empno, mgr, sal);

 INSERT ALL
      INTO emp1 values(empno, hiredate, sal)
      INTO emp2 values(empno, mgr, sal)
     SELECT employee_id empno, hire_date hiredate, salary sal, manager_id mgr
         FROM employees
        WHERE employee_id > 200;
 : employee_id가 200보다 큰 사원의 값을 emp1과 emp2 테이블에 있는 컬럼만 넣는다.

 

4. Conditional INSERT ALL
① 조건을 넣어 insert 한다.
② example

 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;

 : when에 맞는사원이면 into하는데, 두개의 table에 다 들어갈수 있다.

 

5. Conditional INSERT FIRST 
① subquery 결과를 이용하여 조건을 검사하고 값을 넣는다.
② 첫번째 when절이 true면 나머지 when절은 검사하지 않는다.
③ example

 iNSERT FIRST
   WHEN sal>=3000 THEN
     iNTO emp1 VALUES (empno, ename, job, mgr, hiredate, sal, comm, deptno)
   WHEN job = 'MANAGER' THEN
     INTO emp2 VALUES (empno, ename, job, mgr, hiredate, sal, comm, deptno)
   SELECT *
   FROM emp;

 6. Pivoting INSERT
① 같은 table의 다른 컬럼에 같은 값을 넣는다.
② example

 INSERT ALL

     INTO emp1 VALUES (empno, ename)
     INTO emp1 VALUES (empno,  job)
     INTO emp1 VALUES (empno, sal)

     SELECT *
     FROM emp
     WHERE empno = 7788;

 : select 값을 emp1테이블 row에 하나씩 넣는다. 
   즉, into 3번 했으므로, empno가 똑같은 값 3건의 row가 들어간다.

 
3) Merge
 : table을 병합 시킨다.

 create table t_master  as select * from emp where rownum <= 8;
 : emp table의 8row가 들어가는 t_master table 생성

  create table t_tx  as select * from emp;
 : emp table의 값들이 모두 들어있는 t_tx table생성

 update t_tx  set sal = sal+1000, comm = comm+100
 where rownum <= 8;
 : t_tx의 8row만 update

 select * from t_master;
 select * from t_tx;

 prompt Before Merge   
 select * from t_master; 
 : 병합하기 전의 t_master

  MERGE INTO t_master m
 USING  t_tx t
 ON (m.empno = t.empno)
 WHEN MATCHED THEN
  UPDATE SET m.sal = t.sal, m.comm = t.comm
 WHEN NOT MATCHED THEN
  INSERT (m.empno, m.ename, m.sal)
  VALUES (t.empno, t.ename, t.sal);

 : t_master table과 t_tx table을 empno로 join한 뒤 일치하는 값이 있으면 
    t_tx의 sal과 comm은 t_master에 넣고, 일치하지 않으면 t_master에 값을 입력

  prompt After Merge
 select * from t_master;

 : Merge 한 후의 t_master