合并并插入所有语句

时间:2018-10-16 16:46:02

标签: oracle oracle12c

我有一个问题,可以通过使用触发器或Flash数据存档实施完全辅助解决,但这远远超出了要求。

现在,我们正在执行合并,该合并将在一行存在时更新或在行不存在时插入。它运作良好且易于编写。现在,我们有一个新要求,即用户必须知道已更新或插入了哪些行。是的,可以通过在表中引入另一个字段来完成此操作,但这是不允许的,因为那样会更改表。因此,我们不得不创建一个或两个表,以识别通过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 :(得分:1)

在我们的站点上,我们使用after触发器来更新审核内容。它的优点是可以通过程序或如果有人不满意更新语句来跟踪更改。

这可能为您完成工作。