首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ORACLE -从物化视图创建视图

ORACLE -从物化视图创建视图
EN

Stack Overflow用户
提问于 2014-03-19 14:18:32
回答 1查看 1.8K关注 0票数 0

我需要将大量的物化视图更改为Oracle 11g上的常规视图。我的第一个方法是:

1.)获取DDL

代码语言:javascript
运行
复制
select dbms_metadata.get_ddl(replace(object_type, ' ', '_'), object_name, owner)
from all_objects
where owner = 'MY_SCHEMA'
and object_type = 'MATERIALIZED VIEW'
and object_name in (
'MAT_VIEW1'
,'MAT_VIEW2'
,'MAT_VIEW3'
,'MAT_VIEW4'
-- ..
,'MAT_VIEW100'
); 

每一行包含对应的MVIEW,F.E.的DDL:

代码语言:javascript
运行
复制
  CREATE MATERIALIZED VIEW "MY_SCHEMA"."MVIEW1" ("ROW1", "ROW2", "ROW3")
  ORGANIZATION HEAP PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  NOCOMPRESS NOLOGGING
  STORAGE(INITIAL 163840 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MY_TABSPACE" 
  BUILD IMMEDIATE
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MY_TABLESPACE" 
  REFRESH FORCE ON DEMAND
  WITH PRIMARY KEY USING DEFAULT LOCAL ROLLBACK SEGMENT
  USING ENFORCED CONSTRAINTS DISABLE QUERY REWRITE
  AS SELECT ROWA AS ROW1,
  ROWB AS ROW2,
  ROWC AS ROW3
  FROM MY_SCHEMA.TABLE1

2.)使用正则表达式消除附加的技术配置。为了方便起见,我使用RegexBuddy并复制粘贴文本。Oracle不像我注意到的那样支持向前/向后的特性( fas ):

代码语言:javascript
运行
复制
(?=ORGANIZATION\sHEAP).+?(QUERY\sREWRITE)

结果:

代码语言:javascript
运行
复制
  CREATE MATERIALIZED VIEW "MY_SCHEMA"."MVIEW1" ("ROW1", "ROW2", "ROW3")
  AS SELECT ROWA AS ROW1,
  ROWB AS ROW2,
  ROWC AS ROW3
  FROM MY_SCHEMA.TABLE1

最后,我从每个DDL中删除了“物化”,现在我有了视图的有效DDL。

与此同时,我有了一个大胆的想法,并尝试了一下

代码语言:javascript
运行
复制
create view usual_view1 as
select * from mat_view1;

嗯,这也起作用了,用得更少。

因此,我的问题是:从物化视图的定义创建视图时,与通常使用DDL创建视图的方法相比,最终有什么不同吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-19 14:24:41

当您以第二种方式创建视图时,使用:

代码语言:javascript
运行
复制
create view usual_view1 as
select * from mat_view1;

..。您的视图显示的是物化视图所持有的数据,而不是底层表。因为这是refresh force on demand,所以您的“正常”视图将只显示由物化视图持有的陈旧数据,而不是底层表中数据的当前状态。

更重要的是,如果放弃了物化的视图--就像你似乎要取代它们一样--那么你的“正常”视图就会失效。

代码语言:javascript
运行
复制
create materialized view my_mview
refresh force on demand
as select * from dual;

materialized view MY_MVIEW created.

create view my_view as select * from my_mview;

view MY_VIEW created.

select * from my_view;

DUMMY
-----
X     

drop materialized view my_mview;

materialized view MY_MVIEW dropped.

select * from my_view;

SQL Error: ORA-04063: view "STACKOVERFLOW.MY_VIEW" has errors

select text from user_errors where name = 'MY_VIEW';

ORA-00942: table or view does not exist

显然,dual仍然存在,它找不到的是my_mview。视图不知道物化视图的底层表-它没有继承它所使用的查询,它只是显示它包含了什么。它们是非常不同的东西。

您可以使用dbms_metadata.set_transform_param()调用来消除DDL方法中的一些噪音,但据我所知,您无法完全清除它。不过,您可以只获取底层查询:

代码语言:javascript
运行
复制
select query
from all_mviews where owner = 'STACKOVERFLOW'
and mview_name = 'MY_MVIEW';

QUERY                                                      
------------------------------------------------------------
select * from dual                                           

您可以对此进行操作,以使create view ... as处于起始位置;虽然query是一个long列,但我认为您必须在PL/SQL块中这样做,如下所示:

代码语言:javascript
运行
复制
begin
  for r in (
    select mview_name, query
    from all_mviews
    where owner = 'STACKOVERFLOW'
    and mview_name = 'MY_MVIEW'
  ) loop
    dbms_output.put_line('create or replace view '
       || replace(r.mview_name, 'MVIEW', 'VIEW')
       || ' as ' || r.query ||';');
  end loop;
end;
/

anonymous block completed
create or replace view MY_VIEW as select * from dual;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22508752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档