Объедините MERGE и вставьте все - PullRequest
0 голосов
/ 16 октября 2018

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

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

Что я надеюсь сделать, так это взять существующий оператор 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, который работаетв операторах строк и будет медленнее.

1 Ответ

0 голосов
/ 16 октября 2018

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

Это может помочь вам.

...