楼主: ys_yinqin

[PL/SQL] ORA-12015 不能从复杂查询中创建一个可快速刷新的实体化视图 问题解决咨询

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
11#
发表于 2016-11-8 00:53 | 只看该作者
“报错”,报啥错?这是最重要的信息竟然不贴出来?如果你学会有效沟通,问题早解决了。比如你在经过澄清之后,5楼的例子数据还是只有日期没有时间,这不能反应你的实际需求。你的要求是同个ID在同一天有多条数据的。

根据上下文猜测是你的基表没有建日志。可是你1楼分明有这句:
CREATE MATERIALIZED VIEW LOG ON test WITH SEQUENCE, ROWID(a),PRIMARY KEY INCLUDING NEW VALUES;

TEST01上的日志是给TEST02用的,和它自己没有关系。

使用道具 举报

回复
论坛徽章:
1
山治
日期:2016-11-01 10:13:33
12#
 楼主| 发表于 2016-11-8 10:37 | 只看该作者
newkid 发表于 2016-11-8 00:53
“报错”,报啥错?这是最重要的信息竟然不贴出来?如果你学会有效沟通,问题早解决了。比如你在经过澄清之 ...

谢谢版主!
确实是我的描述不正确导致的,抱歉了!

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
13#
发表于 2016-11-8 23:20 | 只看该作者
ys_yinqin 发表于 2016-11-8 10:37
谢谢版主!
确实是我的描述不正确导致的,抱歉了!

那到底是解决了没有呢?
如果还有问题,准备一个干净的环境,所有创建过的对象都DROP然后重来一遍看看哪个步骤出了错。

使用道具 举报

回复
论坛徽章:
1
山治
日期:2016-11-01 10:13:33
14#
 楼主| 发表于 2016-11-9 10:23 | 只看该作者
newkid 发表于 2016-11-8 23:20
那到底是解决了没有呢?
如果还有问题,准备一个干净的环境,所有创建过的对象都DROP然后重来一遍看看哪 ...

通过test表已经解决!谢谢!

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:332013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02秀才
日期:2017-03-20 13:42:20秀才
日期:2017-07-11 13:54:02
15#
发表于 2017-4-28 16:46 | 只看该作者
本帖最后由 samt007 于 2017-4-28 16:49 编辑
newkid 发表于 2016-11-2 15:36
如我前面所说,你必须建立两层物化视图,你可以把它们放到同一个刷新组。

你还得用触发器来设置最后刷新 ...

N版,可以咨询一个物化视图的问题么?
如果我想实现基于自定义函数的物化视图,并且是快速刷新的,有解决的办法么?
例如:CREATE MATERIALIZED VIEW LOG ON INV.MTL_SYSTEM_ITEMS_B WITH ROWID;

CREATE MATERIALIZED VIEW XYG_ALI_SYSTEM_ITEMS_MV
TABLESPACE XYG_DATA --保存表空间
Build immediate--立刻刷新
REFRESH FAST--快速刷新
-- On commit --基表提交的时候刷新
  With ROWID
  AS
  SELECT MSIB.ROWID MSIB_ROWID
        ,MSIB.ORGANIZATION_ID
        ,MSIB.INVENTORY_ITEM_ID
        ,MSIB.SEGMENT1 ITEM_NUMBER
        ,MSIB.DESCRIPTION ITEM_DESC
        ,XYG_PUB_INV_PKG.GET_ITEM_PROPERTY(MSIB.SEGMENT1,MSIB.DESCRIPTION,'SPEC' )  GUIGE--自定义函数
    FROM MTL_SYSTEM_ITEMS_B MSIB
    WHERE INVENTORY_ITEM_ID=270;
现在这个会报错:ORA-12015: 不能从复杂查询中创建一个可快速刷新的实体化视图
不过我觉得应该还是不行的,因为Oracle应该不知道我们自定义的函数究竟涉及到多少个基表,无法用DML的日志,也就无法快速刷新。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
16#
发表于 2017-4-28 21:52 | 只看该作者
假定你的这个函数仅仅依赖于输入参数决定,也就是说,不会有其它表的变动来触发修改。
这时候你可以定义为 SELECT ... 0 AS GUIDE FROM ...
然后在触发器里面调用函数来为:NEW.GUIDE赋值。

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:332013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02秀才
日期:2017-03-20 13:42:20秀才
日期:2017-07-11 13:54:02
17#
发表于 2017-5-2 08:52 | 只看该作者
本帖最后由 samt007 于 2017-5-2 09:46 编辑
newkid 发表于 2017-4-28 21:52
假定你的这个函数仅仅依赖于输入参数决定,也就是说,不会有其它表的变动来触发修改。
这时候你可以定义为 ...

明白了,感谢版主指教。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
18#
发表于 2017-5-2 09:13 | 只看该作者
你本来的写法是
,XYG_PUB_INV_PKG.GET_ITEM_PROPERTY(MSIB.SEGMENT1,MSIB.DESCRIPTION,'SPEC' )  GUIGE

我把你的自定义函数去掉,让它永远为0
,0 AS GUIGE

然后在BEFORE INSERT OR UPDATE触发器中真正对这个列进行赋值。

这个视图可以快速刷新,但是一旦完全刷新会很慢,你必须用ON PREBUILT TABLE的办法,然后建表时用另外一个查询来插入数据(不是建物化视图这个查询,因为这个里面把GUIDE写死成0)。

使用道具 举报

回复
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:332013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02秀才
日期:2017-03-20 13:42:20秀才
日期:2017-07-11 13:54:02
19#
发表于 2017-5-2 09:23 | 只看该作者
newkid 发表于 2017-4-28 21:52
假定你的这个函数仅仅依赖于输入参数决定,也就是说,不会有其它表的变动来触发修改。
这时候你可以定义为 ...

找到这个文章:http://blog.itpub.net/4227/viewspace-607022/
所以版主的意思是用ON PREBUILT TABLE类型的物化视图 ,然后在触发器刷新的办法解决吗?
当前,前提是函数的结果只依赖于当前的表格的数据。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
20#
发表于 2017-5-2 09:32 | 只看该作者
是的,就是老杨这篇文章的同样思路。
要注意初始化用的逻辑(插入大批数据)和增量刷新是不同的。你得写两种不同的SQL。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表