完全打开视图

时间:2008-09-26 02:55:54

标签: oracle views

在Oracle中,是否有一种简单的方法可以完全展开视图?例如:如果我有一个由更多视图上的选择组成的视图,是否有某种方法可以将其解包到直接在真实表上选择?

3 个答案:

答案 0 :(得分:2)

  1. 获取视图的查询文本。

    SELECT text FROM dba_views
    WHERE owner = 'the-owner' AND view_name = 'the-view-name';
    
  2. 解析。在查询文本中搜索视图名称。

  3. 获取找到的每个视图名称的查询文本。 (见第1项。)

  4. 将查询中的每个视图名称替换为相关的查询文本。

  5. 递归执行此操作,直到找不到更多视图。

  6. 易?

    编辑:上述说明并未执行所有操作。考虑到这一点,它变得毛茸茸,长腿,也许是另一只胳膊。查找可能是复杂函数和子查询的列名和列名。将它们与连接和子句一起重新组合在一起。生成的查询看起来可能非常难看。

    在Oracle中的某个地方可能存在实际展开视图的内容。我不知道。我很高兴我没有在Oracle中使用那么多的观点。

答案 1 :(得分:2)

in-line views的概念可以用来做到这一点。假设你有这两个观点:

create or replace view london_dept as
select * from dept
where loc = 'LONDON';

create or replace view london_mgr as
select * from emp 
where job='MANAGER'
and deptno in (select deptno from london_dept);

在第二个视图的SQL中,使用london_dept视图定义中的SQL可以用内联视图替换对视图london_dept的引用,如下所示:

select * from emp 
where job='MANAGER'
and deptno in (select deptno from (select * from dept
where loc = 'LONDON'));

当然,您现在可以看到它过于冗长,可以简化为:

select * from emp 
where job='MANAGER'
and deptno in (select deptno from dept where loc = 'LONDON');

最后,Tom Kyte就创建views of views

的优缺点提出了一些建议

答案 2 :(得分:0)

直到Oracle 12.1正确的答案是否定的,没有简单的方法。现在,在12.1中有DBMS_UTILITY.EXPAND_SQL_TEXT:在Oracle Database 12c Release 1(12.1)中展开对SQL视图的引用就是这样做的。请参阅documentation of dbms_utility