一回のINSERT文で複数行を一度に挿入する

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

INTOVALUESの記述は通常のINSERT文と同じ書き方になります。

ポイントは最後の行の『SELECT * FROM DUAL』の部分です。

FROM DUAL はテーブル指定の事ですが、実際にDUALというテーブルをユーザが定義している訳ではありません。

DUALテーブルはOracleの固有ディクショナリで、実際にはカラム名が存在しないデータ(システム日付など)にアクセスする際や、関数などで利用されます。

複数行を挿入する時は、まずINSERT ALLを変数に格納して、
INTO テーブル名
(カラム名1,カラム名2,…)
VALUES
('値1','値2',…)
をFor文で必要な分ループさせて変数に追加格納し、最後にSELECT * FROM DUALを追加します。

通常のInsert文については、
Insert文でカラム名を指定して一行挿入する』か
Insert文でカラム名を省略して一行挿入する』を参照してください。