Oracle12c 创建物化视图,用union就会报错,如何解决?

Oracle12c 创建物化视图,用union就会报错,报错内容:ORA-12054: 无法为实体化视图设置 ON COMMIT 刷新属性
不使用union,给每个单独的sql创建没问题,只要有union就会报错。我用的是增量刷新,commit提交方式。
创建视图的sql内容如下:

create materialized view log on table_A with rowid ;
create materialized view log on table_B with rowid;
create materialized view log on table_C with rowid ;
create materialized view log on table_D with rowid ;

create materialized view VM_SN_APPLY_PARSE_INFO
REFRESH FORCE ON COMMIT
AS

select a.rowid                 as aid,
       b.rowid                 as bid,
       c.rowid                as cid,
       d.rowid                as did,
       .......                       

  from table_A     a,
       table_B     b,
       table_C     c,
       table_D     d
 where a.is_effective = 1
 ......
      
   union 
   
 select  a.rowid                 as aid,
       b.rowid                 as bid,
       c.rowid                as cid,
       d.rowid                as did,
       .......                       

  from table_A     a,
       table_B     b,
       table_C     c,
       table_D     d
  from  table_A     a,
       table_B     b,
       table_C     c,
       table_D     d
 where spd.is_effective = 2
  ......

尝试将刷新属性设置为ON DEMAND或NEVER,或者修改视图定义,确保不包含不支持ON COMMIT刷新的对象。类似于这样

CREATE MATERIALIZED VIEW mv_name
REFRESH ON DEMAND
AS
SELECT col1, col2, ...
FROM table1
UNION
SELECT col1, col2, ...
FROM table2;

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/655080
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:Oracle数据库 union连接时报 字符集不匹配 异常
  • 除此之外, 这篇博客: Oracle数据库相关中的 4.10.4.8、Union联合查询 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • Union对两个查询结果集进行合并操作,将完全重复的记录剔除(合并重复行),相当于合并操作之后再执行一次distinct操作。

    提示:Union可以对字段名不同但数据类型相同的结果集进行合并,Union只允许对最终合并的结果集进行order by。

    Union查询的限制条件:

    • 两个数据源或结果集必须具有相同的列数量。
    • 依次按照2个数据源的字段顺序合并。
    • 相互合并的字段名称可以不同,但数据类型必须相同或者是兼容类型。
    • 使用Union前数据源字段名称作为最终结果集字段名称。

    person表数据:
    在这里插入图片描述
    person2表数据:
    在这里插入图片描述
    李狗蛋这条记录是完全重复的。现在使用Union联合查询:

    -- Union联合多表查询
    -- 相当于多个查询结果取并集
    SELECT	* FROM person 
    UNION 
    SELECT	* FROM person2; 
    

    在这里插入图片描述
    查询结果只有1条李狗蛋的记录。

    关键:Union联合查询是对多个查询结果进行合并,取并集。