Многострочная вставка: лучшая альтернатива для оператора 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)