Материализованное представление оракула 12c становится недействительным, но не удалось выполнить мастер ddl

Я использую 4 материализованных представления на моем oracle 12c - все они обновляются вручную с помощью вызова хранимой процедуры.

Все представления включают поиск переменной контекста в предложении where, включая временной интервал (от и до).

Контекст был создан

CREATE OR REPLACE CONTEXT myContext using prepare_export;

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

Цепочка выполнения (необходимо обновить только одно представление):

execute prepare_export('MyViewName','20180131','20180231');
  1. запись в таблице data_export создается для логирования data_export

    INSERT INTO DATA_EXPORT 
    (SOURCE_,EXPORT_TIME_,EXPORT_FROM_,EXPORT_TO_,user_name,user_ip) 
    VALUES (viewName,systimestamp,date_From,date_To,(select user from dual),(select sys_context('userenv','ip_address') from dual));`
    
  2. заданы контекстные переменные (от: 20180131 до: 20180231)

    dbms_session.set_context('myContext',viewName || '_from',date_from);
    dbms_session.set_context('myContext',viewName || '_to',date_to);
    
  3. просмотр MyViewName обновляется (атомарное обновление ложно)

    dbms_mview.refresh(viewName,'c',atomic_refresh=>FALSE);
    
  4. запись data_export обновляется с учетом количества (*) последнего обновления

    execute immediate 'UPDATE data_export set resultset_size_=' ||viewRowCount ||' where id_ = (select max(id_) from data_export where source_=''' || viewName || ''' group by source_)';
    

После завершения процедуры все представления становятся недействительными и их необходимо перекомпилировать вручную ...

Есть какая-нибудь помощь?

Спасибо, Джо


person Joe K    schedule 21.02.2018    source источник


Ответы (2)


Я бы не знал. Тем не мение:

... все они обновляются вручную с помощью вызова хранимой процедуры (...) После завершения процедуры все представления становятся недействительными и их необходимо перекомпилировать вручную

Почему бы вам не включить команду ручной перекомпиляции в вышеупомянутую хранимую процедуру?

person Littlefoot    schedule 21.02.2018
comment
конечно, это может сработать, но это не устраняет причину. Кстати - я уже пробовал это, но иногда это не срабатывало - только если я вызываю перекомпиляцию через несколько секунд после завершения хранимой процедуры - person Joe K; 21.02.2018

... Я уменьшил содержимое хранимой процедуры, чтобы просто обновить очень простое (выберите count (*)) и новое материализованное представление - без какой-либо другой вставки, обновления, контекста ... blabla

==> все представления необходимо перекомпилировать впоследствии ...

person Joe K    schedule 21.02.2018
comment
хорошо - его можно воспроизвести с помощью простых материализованных представлений и простого мастера. Иногда представления становятся недействительными после того, как основной DML случается, иногда нет - это зависит от того, было ли выполнено обновление представления ранее и не выполнялась компиляция ... Но это не на 100 процентов детерминировано ... - person Joe K; 22.02.2018