Разница между выполнением текущего запроса и выполнением текущего сценария в oracle

#oracle

Вопрос:

Мне нужно выполнить несколько вставок в Oracle.

 insert into  table_name (ID, code, date_t)
values (schema_name.SEQ$table_name.NEXTVAL, '232323232323'  , to_date('2020-09-01','YYYY-MM-DD'));
insert into  table_name (ID,  code, date_t)
values (schema_name.SEQ$table_name.NEXTVAL, '242424242424'  , to_date('2020-09-01','YYYY-MM-DD'));
 

Я не могу выполнить их при попытке использовать простое выполнение, потому что это приводит к ошибке: ora-00933 sql command not properly ended

Но когда я использую сценарий «Выполнить как«, он работает нормально. Главная проблема в том, что я не могу объяснить людям, как завершить этот сценарий в консоли.

Может быть, есть какие-то другие варианты для выполнения нескольких вставок в Oracle?

Комментарии:

1. Какой клиент/IDE вы используете?

2. Как насчет триггера, который обновляется ID из последовательности?

Ответ №1:

Воспользуйся INSERT ... SELECT :

 insert into  table_name (ID, code, date_t)
WITH data (code, date_t) AS (
  SELECT '232323232323', DATE '2020-09-01' FROM DUAL UNION ALL
  SELECT '242424242424', DATE '2020-09-01' FROM DUAL
)
SELECT SEQ$table_name.NEXTVAL, code, date_t FROM data;
 

Вы также можете использовать INSERT ALL ; однако вам придется перепрыгнуть через некоторые обручи, чтобы заставить его работать с последовательностью, поэтому я бы посоветовал не использовать эту опцию:

 INSERT ALL
  WHEN rn = 1 THEN
    INTO table_name (id, code, date_t)
    VALUES (SEQ$table_name.NEXTVAL, '252525252525', DATE '2020-09-01')
  WHEN rn = 2 THEN
    INTO table_name (id, code, date_t)
    VALUES (SEQ$table_name.CURRVAL, '262626262626', DATE '2020-09-01')
SELECT LEVEL AS rn
FROM   DUAL
CONNECT BY LEVEL <= 2;