sqloraclematerialized-views

ORA-12054: Cannot create Oracle MV refresh on commit, with simple joins (ANSI vs "old style" joins)


while creating a MV refresh on commit, I can make it work with one join, but with two it fails. I suppose it's related to the key-preserving, but I cannot see how. I have tried DBMS_MVIEW.EXPLAIN_MVIEW but it gave me ORA-32342: The EXPLAIN_MVIEW facility failed to explain the materialized view statement


CREATE TABLE TMP_20240730_171526_B
(
    ID INT PRIMARY KEY
);
CREATE TABLE TMP_20240730_171526_C
(
    ID INT PRIMARY KEY
);
CREATE TABLE TMP_20240730_171526_A
(
    ID   INT PRIMARY KEY,
    B_ID INT
        CONSTRAINT TMP_20240730_171526_A_B_FK REFERENCES TMP_20240730_171526_B,
    C_ID INT
        CONSTRAINT TMP_20240730_171526_A_C_FK REFERENCES TMP_20240730_171526_C
);


-- this works
CREATE MATERIALIZED VIEW TMP_20240730_171749_MV REFRESH COMPLETE ON COMMIT
AS
SELECT A.ID A_ID, B.ID B_ID
FROM TMP_20240730_171526_A A
         JOIN TMP_20240730_171526_B B ON A.B_ID = B.ID;
DROP MATERIALIZED VIEW TMP_20240730_171749_MV;

-- this fails: ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
CREATE MATERIALIZED VIEW TMP_20240730_171749_MV REFRESH COMPLETE ON COMMIT
AS
SELECT A.ID A_ID, B.ID B_ID
FROM TMP_20240730_171526_A A
         JOIN TMP_20240730_171526_B B ON A.B_ID = B.ID
         JOIN TMP_20240730_171526_C C ON A.C_ID = C.ID
;

-- clean up
-- DROP MATERIALIZED VIEW TMP_20240730_171749_MV;
DROP TABLE TMP_20240730_171526_A;
DROP TABLE TMP_20240730_171526_B;
DROP TABLE TMP_20240730_171526_C;

Solution

  • Old style JOIN:

    CREATE MATERIALIZED VIEW TMP_20240730_171749_MV REFRESH COMPLETE ON COMMIT
    AS
    SELECT A.ID A_ID, B.ID B_ID
    FROM TMP_20240730_171526_A A
    ,TMP_20240730_171526_B B 
    ,TMP_20240730_171526_C C 
    WHERE A.B_ID = B.ID AND A.C_ID = C.ID
    ;