Объедините MERGE и INSERT ALL статус

У меня есть проблема, которую можно было бы решить, внедрив полную проверку с помощью триггеров или архива флэш-данных, но это намного больше, чем требуется.

Итак, прямо сейчас мы выполняем слияние, которое обновляет строку, когда она присутствует, или вставляет, когда ее нет. Он хорошо работает и его легко писать. Теперь у нас есть новое требование, которое заключается в том, что пользователи должны знать, какие строки были обновлены или вставлены. Да, этого можно добиться, введя в таблицу еще одно поле, но это не разрешено, поскольку это изменит таблицу. Поэтому мы вынуждены создать одну или две таблицы, которые будут определять, какие строки обновляются или вставляются через ПК.

Что я надеюсь сделать, так это взять существующий оператор MERGE и добавить возможность вставки во вторичную таблицу, но я не смог найти никаких операторов слияния, которые работают таким образом, а в INSERT ALL отсутствуют более сложные условия слияния. .

Вот структура оператора MERGE, который используется в настоящее время.

 MERGE INTO EXISTING_TABLE ET USING TMP_TABLE TMP ON (HRR.ID = TMP.ID)
WHEN MATCHED THEN UPDATE SET
    ET.ID = TMP.ID,
    ET.TITLE_EN = TMP.TITLE_EN,
    ET.TITLE_FR = TMP.TITLE_FR,
WHEN NOT MATCHED THEN INSERT (ID, TITLE_EN, TITLE_FR)
    VALUES (TMP.ID, TMP.TITLE_EN, TMP.TITLE_FR);

Ниже приведен способ, которым я надеюсь выполнить MERGE INSERT ALL.

 MERGE INTO EXISTING_TABLE ET USING TMP_TABLE TMP ON (HRR.ID = TMP.ID)
WHEN MATCHED THEN UPDATE 
    SET
        ET.ID = TMP.ID,
        ET.TITLE_EN = TMP.TITLE_EN,
        ET.TITLE_FR = TMP.TITLE_FR,
    INSERT INTO NEW_TABLE (ID, TYPE) VALUES (TMP.ID, 'U')
WHEN NOT MATCHED THEN INSERT ALL
    INTO EXISTING_TABLE (ID, TITLE_EN, TITLE_FR) VALUES (TMP.ID, TMP.TITLE_EN, TMP.TITLE_FR),
    INTO NEW_TABLE (ID, TYPE) VALUES (TMP.ID, 'I');

Единственный другой способ разумно выполнить это, который я вижу, - это блок PLSQL, который работает с операторами строки и будет медленнее.


person Fering    schedule 16.10.2018    source источник
comment
@EvilTeach Нет .... Не могли бы вы изменить свой комментарий на ответ. Trigger определенно справится с тем, что я пытаюсь сделать, и это будет просто и легко.   -  person Fering    schedule 16.10.2018


Ответы (1)


На нашем сайте мы используем триггеры after для обновления материалов аудита. Преимущество заключается в отслеживании изменений с помощью программы или если кто-то толстый нажимает на заявление об обновлении.

Это может сделать работу для вас.

person EvilTeach    schedule 16.10.2018
comment
Учитывая, что я работал с триггерами для нескольких других вещей в этом проекте, я немного разочарован тем, что не учёл для этой цели - person Fering; 16.10.2018
comment
Прямо на вас. Часть волшебства этого сайта заключается в том, что свежая точка зрения может помочь рассеять дым. Возможно, вы сможете что-то собрать с помощью INSERT/RETURNING, но, как вы сказали. Это чисто и легко с триггером - person EvilTeach; 16.10.2018