2012-07-03 5 views
1

Я искал ошибку в своем приложении Java EE для базы данных Oracle: есть материализованное представление, которое не освежает правильно. Если я делаю запрос против MV, он дает мне внешние ключи, которые плохи и кажутся старыми.Получение материализованного представления Oracle для обновления

Так как я могу исправить или заменить этот материализованный вид? Любые мысли приветствуются.

Я попытался освежающие вручную, как это:

DBMS_MVIEW.REFRESH('PRODUCTDESCRIPTIONS', 'C'); 

я получил ошибку "ORA-00942: таблица или представление не существует". Я не понимаю этого, потому что, когда я запускаю подзапрос MV, это выглядит хорошо.

Веб-интерфейс Apex показывает, что MV не обновлялся более года, поэтому это не новая проблема.

Я искал любые записи из процесса обновления, но не смог найти файл refresh.log.

Я попытался заменить материализованное представление простым запросом, но он слишком медленный. Я был бы счастлив переписать/переконфигурировать/переустановить MV каким-то образом.

База данных и версия ОС:

Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product 
PL/SQL Release 10.2.0.1.0 - Production 

uname -a: 
Linux <server name> 2.6.9-78.0.22.ELsmp #1 SMP Thu Apr 30 19:14:39 EDT 2009 i686 i686 i386 GNU/Linux 

Исходный код для материализованного представления:

CREATE MATERIALIZED VIEW "PRODUCTDESCRIPTIONS" 
    ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) 
    TABLESPACE "USERS" 
    BUILD IMMEDIATE 
    USING INDEX 
    REFRESH COMPLETE ON DEMAND 
    USING DEFAULT LOCAL ROLLBACK SEGMENT 
    DISABLE QUERY REWRITE 
    AS SELECT prdcts.primarykey AS product, 
prdcts.upcid AS productupcid, 
prdcts.description AS productdescription, 
prdctctgrs.primarykey AS productcategory, 
prdctctgrs.id AS productcategoryid, 
prdctctgrs.name AS productcategoryname, 
prdctpkgs.primarykey AS productpackage, 
prdctpkgs.name AS productpackagename FROM prdctctgrs, 
prdcts, 
prdctpkgs, 
prdctctgrstoprdcts, 
prdctstoprdctpkgs 
WHERE 
prdctctgrstoprdcts.productcategory = prdctctgrs.primarykey 
AND prdctctgrstoprdcts.product = prdcts.primarykey 
AND prdctstoprdctpkgs.product = prdcts.primarykey 
AND prdctstoprdctpkgs.productpackage = prdctpkgs.primarykey 
AND bitand(prdctctgrs.metaflags, 1)+0 = 0 
AND bitand(prdcts.metaflags, 1)+0 = 0 
AND bitand(prdctpkgs.metaflags, 1)+0 = 0 
AND bitand(prdctctgrstoprdcts.metaflags, 1)+0 = 0 
AND bitand(prdctstoprdctpkgs.metaflags, 1)+0 = 0 
/
+0

Это, похоже, работает: запишите SQL из Apex, как указано выше, отбросьте MV, а затем заново создайте его из SQL. (Также замените ON DEMAND на ON COMMIT.) Что-то в этом MV было глубоко перепутано, возможно, с тех пор, как база данных была создана путем восстановления из файла дампа в другой среде. –

ответ

0

Просто, чтобы подтвердить свой комментарий к исходному вопросу: сброс и восстановление MV исправили проблему.

1

При запуске процедуры обновления, вы его выполнения в качестве владельца таблиц вы хотите купить выбор из? Все ли таблицы, к которым вы обращаетесь, напрямую предоставлены вам? Если таблицы предоставляются вам через роли, то процедура обновления не сможет их увидеть.

+0

Я запускаю его как пользователь базы данных веб-приложений, который также является владельцем таблиц. Согласно Apex, у этого пользователя есть только одна роль, CONNECT, которая, я сомневаюсь, связана с таблицами. С другой стороны, я не вижу никаких конкретных привилегий на таблицах; Я полагаю, что я могу предоставить привилегию SELECT явно для каждой из перечисленных 5 таблиц и посмотреть, помогает ли это. –

+0

Если вы работаете как владелец таблиц, то это не проблема. – DCookie

 Смежные вопросы

  • Нет связанных вопросов^_^