以下の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文を使用します。