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

时间:2010-06-23 11:17:13

标签: oracle view metadata

这听起来应该很简单但不是这样!我找不到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?

7 个答案:

答案 0 :(得分: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 :(得分:2)

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

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

答案 2 :(得分:1)

没有办法,因为每个视图列的定义是表达式,而不是(通常)只是一个表列。例如,您的视图的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
)

您希望在此示例中对“基础列”看到什么?

答案 3 :(得分:1)

定义视图的sql可以在all_views

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

如果您想要一个视图表和列依赖项,这将很好地工作:

WITH view_dependencies (view_name, table_name) AS (
    SELECT CONNECT_BY_ROOT d.name AS view_name, d.referenced_name AS table_name
    FROM all_dependencies d
    WHERE d.referenced_type IN ('TABLE', 'VIEW')
    START WITH d.name = UPPER('jtf_rs_resource_extns_vl') AND d.type = 'VIEW'
    CONNECT BY PRIOR d.referenced_name = d.name AND PRIOR d.referenced_type = d.type
)
SELECT deps.view_name, deps.table_name, tbl.table_id, cols.column_id, 
       cols.column_name  
FROM view_dependencies deps
    LEFT JOIN FND_TABLES tbl ON tbl.table_name = deps.table_name
    LEFT JOIN FND_COLUMNS cols ON tbl.table_id = cols.table_id
ORDER BY deps.view_name,  deps.table_name, cols.column_sequence;

输出

VIEW_NAME                   TABLE_NAME            TABLE_ID COLUMN_ID COLUMN_NAME
=======================================================================================
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563724  RESOURCE_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563712  CREATED_BY
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563713  CREATION_DATE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563718  LAST_UPDATED_BY
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563719  LAST_UPDATE_DATE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563720  LAST_UPDATE_LOGIN
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563704  CATEGORY
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563725  RESOURCE_NUMBER
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563729  SOURCE_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563686  ADDRESS_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563709  CONTACT_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563721  MANAGING_EMPLOYEE_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563730  START_DATE_ACTIVE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563714  END_DATE_ACTIVE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563732  TIME_ZONE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563711  COST_PER_HR
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563723  PRIMARY_LANGUAGE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563726  SECONDARY_LANGUAGE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563717  IES_AGENT_LOGIN
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563728  SERVER_GROUP_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563687  ASSIGNED_TO_GROUP_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563710  COST_CENTER