Многострочная вставка: лучшая альтернатива для оператора INSERT ALL, работающего на Oracle 8i

Что может быть лучшей и наиболее рекомендуемой альтернативой для оператора INSERT ALL, показанного ниже, который работает в версии Oracle 8i? Очень жаль, что это конкретное утверждение не работает в 8i с его простотой и удобочитаемостью. Было бы здорово, если бы вы могли предоставить некоторые материалы. Спасибо.

ВСТАВИТЬ ВСЕ Заявление

INSERT ALL
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
SELECT * FROM dual;

Кроме того, было бы лучше, если по некоторым причинам одна из ваших рекомендаций не совпадает с запросом, показанным ниже.

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
      select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

Большое спасибо!

1 ответ

Если вы хотите вставить эти строки как одну транзакцию, просто выполните:

BEGIN 
  SAVEPOINT some_name;
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
EXCEPTION WHEN OTHERS THEN 
     ROLLBACK TO some_name;
     RAISE; -- reraise current error
END;
/

Это имитирует поведение INSERT ALL
INSERT ALL является единственной командой, поэтому при возникновении некоторой ошибки все изменения, сделанные этой транзакцией, откатываются (см. атомарность на уровне заявления здесь: http://docs.oracle.com/cd/E25054_01/server.1111/e25789/transact.htm)

Другие вопросы по тегам