У меня есть проблема, которая может быть решена путем реализации полного преобразования с использованием триггеров или архива флэш-данных, но это гораздо больше, чем требуется.
Так что сейчас мы выполняем слияние, которое обновляет строку, когдаего настоящее или вставка, когда его нет.Это работает хорошо и было легко написать.Теперь у нас есть новое требование: пользователи должны знать, какие строки были обновлены или вставлены.Да, это можно сделать, введя другое поле в таблицу, но это не разрешено, потому что это изменит таблицу.Поэтому мы вынуждены создать одну или две таблицы, которые будут определять, какие строки обновляются или вставляются через 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, который работаетв операторах строк и будет медленнее.