-- new and modified rows:
MERGE INTO target tgt
USING (SELECT n.*,
o.rowid row_id
FROM (SELECT [mv SQL]) n,
target o
WHERE n.pkcol = o.pkcol(+)
AND (o.pkcol IS NULL OR -- new rows
n.attr1 != o.attr1 OR -- changed rows
n.attr2 != o.attr2)) src
ON (src.rowid = tgt.ROWID)
WHEN MATCHED THEN UPDATE SET tgt.attr1 = src.attr1,
tgt.attr2 = src.attr2
WHEN NOT MATCHED THEN INSERT (pkcol,
attr1,
attr2)
VALUES (src.pkcol,
src.attr1,
src.attr2);
-- deleted rows:
DELETE FROM target
WHERE pkcol NOT IN (SELECT pkcol FROM (SELECT [mv SQL]));
2条答案
按热度按时间daolsyd01#
必须在定义视图时将视图定义为快速刷新视图。对于具有联接的视图,每个表的ROWID必须位于视图中。此外,必须使用
with rowid
创建实体化视图日志。参见:https://docs.oracle.com/cd/B19306_01/server.102/b14223/basicmv.htm#sthref537
xhv8bpkk2#
快速刷新当然是最有效的选项,但由于限制,并不总是可行的,而且源表的所有者通常不希望在其表上有触发器(这可能会导致表的维护方式受到限制)。它还有一个缺点,即只会增加更多的复杂性(触发器、日志表等)。
我发现在大多数情况下,MERGE语句工作得最好,因为它可以像外科手术一样只添加和/或修改需要更改的行。
这当然可以与PDML并行化。