DML文を使用した表の管理31 / 50 問

以下のSQL文で、どのような結果が返されますか。

DESC employees
 名前                 NULL?    型
 -------------------- -------- ------------
 EMPLOYEE_ID          NOT NULL NUMBER(6)
 SALARY               NOT NULL NUMBER(8,2)

INSERT ALL
  INTO employees (employee_id, salary) VALUES (100, 1000)
  INTO employees (employee_id, salary) VALUES (101, 2000)
  INTO employees (employee_id, salary) VALUES (102, 3000)
SELECT * FROM dual;
A3件のデータが挿入される✓
B1件のデータが挿入される
C0件のデータが挿入される
Dエラーになる
正解:A解説

INSERT ALLは、副問合せが返す1行ごとに、すべてのINTO句を実行するマルチテーブルINSERTです。
SELECT * FROM dualは1行を返すため、3つのINTO句がそれぞれ1回ずつ実行され、3行が挿入されます。

INSERT ALL
  INTO employees (employee_id, salary) VALUES (100, 1000)
  INTO employees (employee_id, salary) VALUES (101, 2000)
  INTO employees (employee_id, salary) VALUES (102, 3000)
SELECT * FROM dual;

3行が作成されました。

INSERT ALLのポイント

  • INTO句は同じ表でも、異なる表でも指定できます。
  • 副問合せが2行を返す場合、各INTO句が2回ずつ実行され、6行が挿入されます。
  • 副問合せは省略できません。複数行を固定値で挿入するときは、1行を返すdual表を使うのが定番です。

Oracle Database 19cでは、VALUES (100, 1000), (101, 2000)のようにVALUES句に複数の行を指定することはできません。1つのINSERT文で複数行を挿入するには、INSERT ALLか副問合せを使ったINSERT文を使用します。

前後の問題