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