首页 文章

如何查找Oracle视图的基础列和表名?

提问于
浏览
2

这听起来应该很简单但不是这样!我找不到Oracle(元数据)视图,它为Oracle视图列提供了基础列和表名 . 我发现这样做的唯一方法是解析视图源SQL(这远非精确科学) .

只是为了解释我想要的,请考虑我在SCOTT模式中创建的以下示例视图:

CREATE OR REPLACE VIEW EMP_DEP
(
   EMPLOYEE_NAME,
   DEPARTMENT_NAME
)
AS
SELECT 
   ENAME,
   DNAME 
FROM
   emp a,
   dept b
WHERE
   a.deptno= b.deptno
/

现在给出了视图和列名EMP_DEP.DEPARTMENT_NAME,我想获得视图使用的底层表和列名,即DEPT.DNAME . 有没有人知道获取此信息的方法,而不涉及解析视图的SQL?

6 回答

  • 2

    可以使用查询选择用于创建视图的表:

    select 
      name , 
      type , 
      referenced_name , 
      referenced_type
    from 
      user_dependencies 
    where 
      name = 'VIEW_NAME' and 
      type = 'VIEW' and  
      referenced_type = 'TABLE';
    

    如果视图列具有相同的列列名称,请尝试以下查询:

    select 
      distinct table_name, column_name 
    from 
      all_tab_columns 
    where table_name in (select
                            referenced_name
                          from 
                            user_dependencies 
                          where 
                            name = 'VIEW_NAME' and 
                            type = 'VIEW' and  
                            referenced_type = 'TABLE') 
     and column_name in (select 
                            column_name 
                         from 
                            all_tab_columns 
                         where 
                            table_name = 'VIEW_NAME');
    
  • 1

    由于请求者正在寻找他的表的任何实例,而不是特定视图,我建议:

    SELECT *
      FROM DBA_DEPENDENCIES
     WHERE TYPE = 'VIEW'
       AND REFERENCED_TYPE = 'TABLE'
       AND REFERENCED_NAME = '<TABLE_NAME>'
    
  • 1

    没有办法,因为每个视图列的定义是 expression ,而不是(通常)只是一个表列 . 例如,您的视图的SQL可能是:

    SELECT 
       UPPER(ENAME) || 'xxx',
       myfunction(DNAME)
    FROM
       emp a,
       dept b
    WHERE
       a.deptno= b.deptno
    

    也许

    SELECT ename || 'xxx', dname
    FROM (
      SELECT 
         UPPER(ENAME) AS ename,
         myfunction(DNAME) AS dname
      FROM
         emp a,
         dept b
      WHERE
         a.deptno= b.deptno
    )
    

    对于此示例中的“基础列”,您期望看到什么?

  • 2

    可以在all_views中找到定义视图的sql

    set long 9999 
    select TEXT from all_views where VIEW_NAME='MYVIEW';
    

    这是获取基础表和列的唯一方法 .

  • 1

    在11g Oracle中引入了finer grained dependency tracking . 因此数据库知道视图或包体所依赖的表列 . 但是,他们似乎没有在视图中公开这些数据 . 但是信息可能有x $表 .

  • 1

    linked procedures可能对识别依赖关系有所帮助

    DBA_DEPENDENCIES视图将为您提供View所基于的表的列表:

    SELECT *
      FROM DBA_DEPENDENCIES
     WHERE OWNER = <Schema>
       AND NAME = <View_Name>
       AND TYPE = 'VIEW'
    

相关问题