Почему при создании этого простого материализованного представления возникает ошибка ORA-12054? - PullRequest
2 голосов
/ 16 января 2012
ALTER TABLE RECORDINGS ADD PRIMARY KEY (ID);

CREATE MATERIALIZED VIEW LOG ON RECORDINGS TABLESPACE USERS NOLOGGING;

DROP MATERIALIZED VIEW REC_SEARCH_TEST;
CREATE MATERIALIZED VIEW REC_SEARCH_TEST
REFRESH COMPLETE ON COMMIT
AS (
    SELECT DISTINCT ID, TITLE FROM RECORDINGS
);


ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

Не могу понять, что здесь не так, я знаю, что если я уберу предложение DISTINCT, оно будет работать, но почему я не могу использовать 'DISTINCT', если я укажу 'REFRESH COMPLETE ON COMMIT', которая требуется.

Если я использую DISTINCT и REFRESH по требованию, проблем не возникает, но это не требования.

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Похоже, что с добавлением DISTINCT вы сделали базовый SQL своего представления непригодным для быстрого обновления и, следовательно, не можете использовать его с ON COMMIT (даже если вы укажете обновление завершено вместо быстрого обновления).Начиная с Документы Oracle :

Два режима выполнения обновления: ON COMMIT и ON DEMAND.В зависимости от созданного материализованного представления некоторые параметры могут быть недоступны.Таблица 8-4 описывает режимы обновления.

Таблица 8-4 Режимы обновления

ON COMMIT

Обновление происходит автоматически, когда транзакция, которая изменила одиниз подробных таблиц материализованного представления фиксирует. Это может быть указано до тех пор, пока материализованное представление быстро обновляется (другими словами, не сложно).Для использования этого режима необходима привилегия ON COMMIT.

ON DEMAND

Обновление происходит, когда пользователь вручную выполняет одну из доступных процедур обновления, содержащихся в пакете DBMS_MVIEW (REFRESH, REFRESH_ALL_MVIEWS, REFRESH_DEPENDENT).

В той же ссылке на документ есть список ограничений для быстрого обновления.

1 голос
/ 16 января 2012

"Возможно, пример не самый лучший, потому что я хочу расширить представление на более сложный запрос, который потребует отдельного ключевого слова, сейчас я просто пытаюсь заставить его работать на базовом уровне. «

DISTINCT является причиной ORA-12054.

SQL> CREATE MATERIALIZED VIEW REC_SEARCH_TEST
    REFRESH COMPLETE ON COMMIT
    AS (
       SELECT DISTINCT empno, ename FROM emp
   )
/
  2    3    4    5    6  
       SELECT DISTINCT empno, ename FROM emp
                                         *
ERROR at line 4:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view


Elapsed: 00:00:01.14
SQL> SQL> 
SQL> CREATE MATERIALIZED VIEW REC_SEARCH_TEST
    REFRESH COMPLETE ON COMMIT
    AS (
       SELECT empno, ename FROM emp
   )
/
  2    3    4    5    6  
Materialized view created.

Elapsed: 00:00:02.33
SQL> 

Почему бы не начать с чего-то, что работает ? Удалите DISTINCT. Получите ваш MView работает. Затем усложните это позже, когда это станет необходимым.

Хотя, как вы уже знаете, вы не можете использовать DISTINCT, вам придется пересмотреть либо логику вашего запроса, либо свою стратегию обновления.

0 голосов
/ 20 ноября 2013

Важно отметить, что вопрос не о быстром обновлении, а о полном обновлении. Таким образом, нет логической причины, по которой должны применяться обычные ограничения для быстрого обновления при фиксации, кроме той, что все объекты, на которые ссылаются, должны быть локальными.

«Обновление завершено при фиксации» - это относительно новая функция, поэтому лучшим ответом на вопрос «почему», вероятно, является то, что «Oracle еще не реализовал это полностью, пожалуйста, проверьте будущие версии Oracle Database». Не очень полезно, но правда ...

...