2012-07-03 78 views
1

我已将Java EE应用程序中的一个错误追溯到Oracle数据库:存在一个不正确刷新的物化视图。如果我对MV进行查询,它会给我外键不好,看起来很老。获取Oracle物化视图以刷新

那么,我该如何修复或替换这个物化视图?任何想法都欢迎。

我试过手动刷新,这样的:

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

我得到了错误 “ORA-00942:表或视图不存在”。我不明白这一点,因为当我手动运行MV的子查询时,它看起来很好。

Apex Web界面显示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

这似乎工作:从上面记录Apex的SQL,放下MV,然后从SQL重新创建它。 (也可以用ON COMMIT替换ON DEMAND。)该MV中的某些东西被深深地搞砸了,可能是因为数据库是通过从不同环境中的转储文件恢复而创建的。 –

回答

0

只是为了确认我对原始问题的评论:删除和重新创建MV解决了问题。

1

当您运行刷新程序,你执行它作为你的表的所有者从?中选择?你访问的所有表格是直接授予你的吗?如果这些表通过角色授予您,则刷新过程将无法看到它们。

+0

我将它作为Web应用数据库用户运行,该用户也是表的所有者。根据Apex的说法,这个用户只有一个角色,CONNECT,我怀疑这个角色与表格有关。另一方面,我没有看到桌上特殊的特权赠款;我想我可以在列出的5个表中的每一个表上明确授予SELECT特权,并查看是否有帮助。 –

+0

如果你是作为表的所有者运行,那么这不是问题。 – DCookie