本連載はSQLの応用力を身に付けたいエンジニア向けに、さまざまなテクニックを紹介する。SQLの基本構文は平易なものだが、実務で活用するには教科書的な記述を理解するだけでは不十分だ。本連載は、著名なメールマガジン「おら!オラ! Oracle - どっぷり検証生活」を発行するインサイトテクノロジーのコンサルタントを執筆陣に迎え、SQLのセンス向上に役立つ大技小技を紹介していく。(編集局)
FOR...LOOP文を使って、いくつものSQL文でデータをINSERTしているPL/SQLプロシージャやプログラムをよく見掛けますが、実は1度にデータをINSERTする方法もあるんです。マルチテーブル・インサート(Multitable Insert)とはその名のとおり、1つのSQL文で複数の表にINSERTが可能になります。この最大のメリットは、やはりパフォーマンスです。では早速ご紹介します。
ここでは、VALUES句を使って値を指定します。
SQL> insert all 2 into sample_table (id, name, value) values (1, 'TKISHIMO', 0) 3 into sample_table2 (id, name, value) values (2, 'MHAYASHI', 0) 4 select * from dual; 2行が作成されました。
上記のSQL文を実行後、sample_tableとsample_table2をSELECTしてみると……。
SQL> select * from sample_table;
ID NAME VALUE
---------- -------------------- ----------
1 TKISHIMO 0
SQL> select * from sample_table2;
ID NAME VALUE
---------- -------------------- ----------
2 MHAYASHI 0
一度のSQL文でsample_tableとsample_table2にデータがINSERTされました。これを使えば、Parse処理も1回で済みますし、SQL文も1つで済むので、パフォーマンスにもいい影響を与えますよね。
では、次に副問い合わせする表の内容を分割して、異なる表にINSERTする方法をご紹介します。
SQL> create table emp2 as 2 select * from emp where 1 = 0; 表が作成されました。 SQL> select * from emp2; レコードが選択されませんでした。 SQL> create table emp3 as 2 select * from emp where 1 = 0; 表が作成されました。 SQL> select * from emp3; レコードが選択されませんでした。
リスト3のSQL文でEMP表の枠だけコピーして、EMP2とEMP3を作成します。そこへ、リスト4のSQL文を実行します。
SQL> insert all 2 into emp2(empno, ename) values (empno, ename) 3 into emp3(empno, job) values (empno, job) 4 select * from emp; 24行が作成されました。
それぞれ、EMP2とEMP3にINSERTされたデータは以下のとおりです。
SQL> select * from emp2;
EMPNO ENAME JOB MGR HIREDATE SAL
COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ------
---- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7839 KING
7844 TURNER
7900 JAMES
7902 FORD
7934 MILLER
12行が選択されました。
SQL> select * from emp3;
EMPNO ENAME JOB MGR HIREDATE SAL
COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ------
---- ----------
7369 CLERK
7499 SALESMAN
7521 SALESMAN
7566 MANAGER
7654 SALESMAN
7698 MANAGER
7782 MANAGER
7839 PRESIDENT
7844 SALESMAN
7900 CLERK
7902 ANALYST
7934 CLERK
12行が選択されました。
EMP表からEMPNO列、ENAME列、JOB列の12行が、それぞれの表(EMP2、EMP3)に分かれてINSERTされていますね。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.