👀
【Oracle】複数行INSERTの注意点(Oracle独自の方言あり)
1. 複数行INSERTとは
INSERT文は、一般的(?)に1行ずつ実行します。
例えばこんな感じ...
SQL> INSERT INTO table_1 VALUES (1, 'Taro');
1行が作成されました。
SQL> INSERT INTO table_1 VALUES (2, 'Ken');
1行が作成されました。
SQL> INSERT INTO table_1 VALUES (3, 'Yuki');
1行が作成されました。
上記の例では、3回に分けて実行していますが、工夫すると1回の実行にまとめることが出来ます。
これを複数行INSERTと言います。
どのような形にまとめるかというと、Oracle以外のRDB(SQL Server、MySQL、PostgreSQLなど)では、INSERT INTO table_1 VALUES (4, 'Mio'), (5, 'Sora'), (6, 'Akira');
のような形で、複数行分のINSERTをまとめます。
しかし、Oracleにおいては注意が必要です。
2. Oracleにおける複数行INSERTの実行方法
結論として、Oracleでは以下の形式で実行する必要があります。
「ALL」や「SELECT * FROM DUAL」が特徴的ですね。
試しに、Oracle以外のRDB(SQL Server、MySQL、PostgreSQLなど)で使われる複数行INSERTを、Oracle上で実行してみます(環境:Oracle Database 19c)。
SQL> INSERT INTO table_1 VALUES
2 (4, 'Mio'),
3 (5, 'Sora'),
4 (6, 'Akira');
(4, 'Mio'),
*
行2でエラーが発生しました。:
ORA-00933: SQLコマンドが正しく終了されていません。
見事に失敗しましたね。
では、Oracle独自の方法を試してみます。
SQL> INSERT ALL
2 INTO table_1 VALUES (4, 'Mio')
3 INTO table_1 VALUES (5, 'Sora')
4 INTO table_1 VALUES (6, 'Akira')
5 SELECT * FROM DUAL;
3行が作成されました。
上手く、INSERTできました。
3. 備考
複数行INSERTを実行してエラーになった場合、エラーの原因がどの行や値なのかという特定作業が通常のINSERTと比べると大変になります。(数行くらいであれば大した問題ではないかもしれませんが...)
参考書籍:ミック(2016).『SQL 第2版: ゼロからはじめるデータベース操作』.翔泳社
Discussion