👀

【Oracle】複数行INSERTの注意点(Oracle独自の方言あり)

2024/01/06に公開

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