Freitag, Dezember 12, 2008

INSERT ALL

kein ganz neues Feature aber sehr praktisch ist das INSERT ALL-Statement, mit dem man z.B. den Inhalt einer großen Tabelle auf mehrere kleine Tabellen verteilen kann. Das Vorgehen dabei sieht etwa folgendermaßen aus:

SQL> select * from emp;

EMPNO ENAME      JOB              MGR HIREDATE          SAL 
---------- ---------- --------- ---------- ---------- ---------- 
7369 SMITH      CLERK           7902 17.12.1980        800 
7499 ALLEN      SALESMAN        7698 20.02.1981       1600 
7521 WARD       SALESMAN        7698 22.02.1981       1250 
7566 JONES      MANAGER         7839 02.04.1981       2975 
7654 MARTIN     SALESMAN        7698 28.09.1981       1250 
7698 BLAKE      MANAGER         7839 01.05.1981       2850 
7782 CLARK      MANAGER         7839 09.06.1981       2450 
7788 SCOTT      ANALYST         7566 19.04.1987       3000 
7839 KING       PRESIDENT            17.11.1981       5000 
7844 TURNER     SALESMAN        7698 08.09.1981       1500 
7876 ADAMS      CLERK           7788 23.05.1987       1100 
7900 JAMES      CLERK           7698 03.12.1981        950 
7902 FORD       ANALYST         7566 03.12.1981       3000 
7934 MILLER     CLERK           7782 23.01.1982       1300 

14 Zeilen ausgewõhlt.

SQL> create table emp_old
2  as
3  select * from emp where 1 = 0;

Tabelle wurde erstellt.

SQL> create table emp_new
2  as
3  select * from emp where 1 = 0

Tabelle wurde erstellt.

SQL> insert all
2  when HIREDATE <= to_date('31.12.1981')
3  then into emp_old 
values(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL)
4  when HIREDATE > to_date('31.12.1981')
5  then into emp_new 
values(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL)
6  select EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
7    from emp;

14 Zeilen wurden erstellt.

SQL> select * from emp_old;

EMPNO ENAME      JOB              MGR HIREDATE          SAL 
---------- ---------- --------- ---------- ---------- ---------- 
7369 SMITH      CLERK           7902 17.12.1980        800 
7499 ALLEN      SALESMAN        7698 20.02.1981       1600 
7521 WARD       SALESMAN        7698 22.02.1981       1250 
7566 JONES      MANAGER         7839 02.04.1981       2975 
7654 MARTIN     SALESMAN        7698 28.09.1981       1250 
7698 BLAKE      MANAGER         7839 01.05.1981       2850 
7782 CLARK      MANAGER         7839 09.06.1981       2450 
7839 KING       PRESIDENT            17.11.1981       5000 
7844 TURNER     SALESMAN        7698 08.09.1981       1500 
7900 JAMES      CLERK           7698 03.12.1981        950 
7902 FORD       ANALYST         7566 03.12.1981       3000 

11 Zeilen ausgewõhlt.

SQL> select * from emp_new;

EMPNO ENAME      JOB              MGR HIREDATE          SAL 
---------- ---------- --------- ---------- ---------- ---------- 
7788 SCOTT      ANALYST         7566 19.04.1987       3000 
7876 ADAMS      CLERK           7788 23.05.1987       1100 
7934 MILLER     CLERK           7782 23.01.1982       1300 

Nützlich an diesem Feature ist vor allem, dass hier nur ein FTS erforderlich ist, während das Füllen der Zieltabellen über mehrere Statements natürlich mehrere Zugriffe erfordern würde.

Keine Kommentare:

Kommentar veröffentlichen