Oracle 完全展开视图

Oracle 完全展开视图,oracle,views,Oracle,Views,在Oracle中,是否有一种简单的方法可以完全展开视图?如果我有一个视图是由多个视图上的选择组成的,有没有什么方法可以将其展开,直接在实际表上选择 获取视图的查询文本 SELECT text FROM dba_views WHERE owner = 'the-owner' AND view_name = 'the-view-name'; 解析。在查询文本中搜索视图名称 获取找到的每个视图名称的查询文本。(见第1项。) 用相关查询文本替换查询中的每个视图名称 递归地执行此操作,直到找不到更多视

在Oracle中,是否有一种简单的方法可以完全展开视图?如果我有一个视图是由多个视图上的选择组成的,有没有什么方法可以将其展开,直接在实际表上选择

  • 获取视图的查询文本

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

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

  • 用相关查询文本替换查询中的每个视图名称

  • 递归地执行此操作,直到找不到更多视图为止

  • 容易吗

    编辑:上述说明并不能完成所需的所有操作。再想一想,它会变得多毛,长出腿,也许还会长出另一只手臂。查找列名,以及可能是复杂函数和子查询的列名。把它和连接和子句放在一起。结果查询可能看起来很难看

    在Oracle内部的某个地方,可能有某种东西实际上正在展开视图。我不知道。我很高兴在Oracle中没有太多地使用视图。

    的概念可以用来实现这一点。假设您有以下两个视图:

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

    在第二个视图的SQL中,可以使用london_dept视图定义中的SQL将对view 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就在Oracle 12.1之前创建

    的优缺点提出了一些建议。正确答案是否定的,没有简单的方法。现在,在12.1中有DBMS_实用程序。EXPAND_SQL_TEXT:EXPAND SQL References to Views in Oracle Database 12c Release 1(12.1)正是这样做的。见

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