Материализованный вид "MV_AMP":
CREATE MATERIALIZED VIEW MV_AMP
NOLOGGING
BUILD IMMEDIATE
REFRESH FORCE
ON DEMAND
AS
Select a, b, c from amp;
Материализованное представление "MV_BOT", которое зависит от "MV_AMP":
CREATE MATERIALIZED VIEW MV_BOT
NOLOGGING
BUILD IMMEDIATE
REFRESH FORCE
ON DEMAND
AS
SELECT bot.x, bot.y, mv_amp
FROM bot, mv_amp
WHERE bot.a = mv_amp.a;
И создать уникальный индекс в mv_bot:
CREATE UNIQUE INDEX mv_bot_idx001 ON mv_bot(x, a);
После успешного создания представлений и индексов, предположим, что я добавляю дублирующееся значение, которое вызывает ошибку типа (dup_val_on_index) при обновлении mv_bot из-за уникального индекса.
Поэтому я делаю обновление в MV_AMP (основной вид), используя nested = TRUE, и Oracle не вызывает ошибку:
BEGIN
dbms_mview.refresh_dependent(number_of_failures => n_failures,
list => 'MV_AMP',
atomic_refresh => TRUE,
nested => TRUE);
EXCEPTION
WHEN
OTHERS THEN
-- it never reach this code
dbms_output.put_line('Errors: '||SQLERRM);
END;
n_failures возвращает: 0 и никогда не достигает dbms_output внутри исключения.
Мне нужно отловить ошибку, когда oracle пытается обновить вложенные MV и войти в таблицу.
Использование Oracle 11g.