oracle - 破解 MV 日志以捕获变更数据

标签 oracle

我正在考虑一种以 Oracle 不希望的方式使用物化 View 日志的解决方案。 这个想法是为 Oracle 源和非 Oracle 目标实现快速刷新 MV 功能。 我已经测试了这种方法以确认它有效,但我担心这种意外和不受支持的使用的长期后果。

MY_TAB 是我想在另一个非 Oracle RDBMS 中镜像的 Oracle (11.2) 表。

目标表的引用由源数据库中的 Oracle 过程调用的外部进程应用。 该进程接受从 MV 日志中提取的数据集,并将更改应用于目标。 成功执行后,已处理的更改将从 MV 日志中删除。

MLOG$_MY_TAB 是创建为 MY_TAB 的 MV 日志:

CREATE MATERIALIZED VIEW LOG ON my_tab
WITH PRIMARY KEY;

注意:不会有与此 MV 日志关联的 MV。

referesh 过程是通过调用以下过程来调用的:

BEGIN

  SELECT *
  FROM mlog$_my_tab;

  /* Call externall process and pass the data */

  DELETE mlog$_my_tab;

  COMMIT;

END;

除了一般的意外/不受支持的问题之外,是否有人发现此方法有任何具体问题?

最佳答案

根据我的上述评论,我想建议修改方法。创建一个新表说 mv_log_replica。该表应该是您的 mv_log 表的副本。

BEGIN
   DELETE FROM mv_log_replica;
   INSERT INTO mv_log_replica
   (
   pk_col,
   col1,
   col2)
   SELECT
   pk_col,
   col1,
   col2
   FROM mlog$_my_tab;

   /* Call externall process and pass the data */
   /* Here instead of mlog$_my_tab use the mv_log_replica table */

   DELETE FROM mlog$_my_tab a 
   WHERE EXISTS (SELECT 1 FROM mv_log_replica b WHERE a.pk_col = b.pk_col);

   COMMIT;
END;

这种方法将确保您只删除复制到 mv_log_replica 表的数据。如果任何额外的数据被插入到 mv_log 之间,它不会被删除。此外,您可以使 mv_log_replica 成为全局临时表(ON COMMIT DELETE ROWS)。

关于oracle - 破解 MV 日志以捕获变更数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38732414/

相关文章:

sql - Oracle Connect By Prior 递归查询语法

sql - SELECT 语句 - 将附加列添加到结果集中

mysql - sql 查询,在 where 类中进行行比较

sql - 可更新 View (Oracle)

java - 甲骨文异常: invalid table name

oracle - 使用动态插入插入数据时在 Oracle 中获取 ORA-01747 : invalid user. table.column、table.column 或列规范

sql - 从 Oracle 迁移到 PostgreSQL 时对 sibling BY 和 rownum 进行 ORDER

sql - 根据优先级获取不同的行?

php - OCIEnvNlsCreate() 失败。当我尝试在 php 中连接我的 oracle 数据库时

sql - 在 Oracle 中 substr 或 LIKE 更快吗?