Как я могу написать хранимую процедуру для вставки / обновления всех записей одновременно, и если что-то не получается, я хочу откатить транзакцию.
Обычный способ - установитьSAVEPOINT
и, если возникнут ошибки, ROLLBACK
до точки сохранения.Это дает вам возможность продолжить транзакцию со следующей записью, если хотите.Кроме того, сохраняется транзакция, позволяющая обрабатывать один COMMIT
только в самом конце (что хорошо по нескольким причинам, которые могут вызывать споры и не являться предметом вашего вопроса).
Здесьобщая идея:
FOR r IN ( ... select your source data, or maybe load it from a file ... ) LOOP
BEGIN
SAVEPOINT myproc_pre_insert;
INSERT INTO rules_group ...;
INSERT INTO rules_sub_group ...;
INSERT INTO rules ...;
INSERT INTO rules_expression ...;
INSERT INTO rules_expression_eval ...;
EXCEPTION
WHEN others THEN
ROLLBACK TO myproc_pre_insert;
... log error, possibly ...
... either (A) abort the process ...
RAISE;
... or (B) continue with the next record
CONTINUE;
END;
END LOOP;
COMMIT;
В зависимости от того, как ваши таблицы и каковы ваши исходные данные, вы также можете объединить некоторые из пяти (5) INSERT
операторов, используя INSERT ALL
.