Вставить данные в несколько таблиц в хранимой процедуре оракула - PullRequest
0 голосов
/ 11 июля 2019

У меня есть пять таблиц и 5 связанных таблиц.

1) Rules_Group (GroupId-первичный ключ)
2) Rules_Sub_Group (GroupId - внешний ключ от Rules_Group)
3) Правила (SubGroupId- Внешний ключ из Rules_Sub_Group)
4) Rules_Expression (RulesId - Внешний ключ из правил)
5) Rules_Expression_Eval (RulesId - Внешний ключ из правил)

Как написать хранимую процедуру для вставки /обновлять все записи одновременно, и если что-то не получается, я хочу откатить транзакцию.

Каков наилучший способ сделать это?

1 Ответ

4 голосов
/ 11 июля 2019

Как я могу написать хранимую процедуру для вставки / обновления всех записей одновременно, и если что-то не получается, я хочу откатить транзакцию.

Обычный способ - установить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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...