INSERT ALL INTO 文で複数行のデータを一度に挿入する方法です。
複数行のデータ挿入は、INSERT文を何回も発行する事でも可能です。
数行であれば毎回SQLを発行しても良いかもしれません、ですが何十行、何百行のデータを挿入する時に、毎回SQLを発行するのはあまり現実的ではありません。
そんな時は、INSERT ALL INTO ~VALUES ~SELECT * FROM DUAL という形で記述すると1度のSQL発行でデータを挿入する事が出来るようになります。
INSERT ALL
INTO テーブル名
(カラム名1,カラム名2,…)
VALUES
('値1','値2',…)
INTO テーブル名
(カラム名1,カラム名2,…)
VALUES
('値1','値2',…)
SELECT * FROM DUAL
INTO~VALUESの記述は通常のINSERT文と同じ書き方になります。
ポイントは最後の行の『SELECT * FROM DUAL』の部分です。
FROM DUAL はテーブル指定の事ですが、実際にDUALというテーブルをユーザが定義している訳ではありません。
DUALテーブルはOracleの固有ディクショナリで、実際にはカラム名が存在しないデータ(システム日付など)にアクセスする際や、関数などで利用されます。
複数行を挿入する時は、まずINSERT ALLを変数に格納して、
INTO テーブル名
(カラム名1,カラム名2,…)
VALUES
('値1','値2',…)
をFor文で必要な分ループさせて変数に追加格納し、最後にSELECT * FROM DUALを追加します。
通常のInsert文については、
『Insert文でカラム名を指定して一行挿入する』か
『Insert文でカラム名を省略して一行挿入する』を参照してください。