【问题标题】:Recursively list concents of Oracle's DBA_DEPENDENCIES view递归列出 Oracle DBA_DEPENDENCIES 视图的内容
【发布时间】:2011-10-17 18:27:16
【问题描述】:

我想要一个给定视图的依赖表列表(最终)。

例如:

SELECT NAME, TYPE, REFERENCED_NAME, REFERENCED_TYPE
FROM DBA_DEPENDENCIES
WHERE OWNER='FOO'
AND NAME='VIEW_O1'

结果:

VIEW_O1 VIEW    TABLE_01    TABLE
VIEW_O1 VIEW    TABLE_02    TABLE
VIEW_O1 VIEW    TABLE_03    TABLE
VIEW_O1 VIEW    VIEW_02     VIEW
VIEW_O1 VIEW    VIEW_03     VIEW

我希望它类似于:

VIEW_O1 VIEW    TABLE_01    TABLE
VIEW_O1 VIEW    TABLE_02    TABLE
VIEW_O1 VIEW    TABLE_03    TABLE
VIEW_O1 VIEW    VIEW_02     VIEW
VIEW_O1 VIEW    VIEW_03     VIEW
VIEW_O2 VIEW    TABLE_03    TABLE
VIEW_O2 VIEW    TABLE_04    TABLE
VIEW_O3 VIEW    TABLE_05    TABLE
VIEW_O3 VIEW    VIEW_04     VIEW
VIEW_O4 VIEW    TABLE_06    TABLE
VIEW_O4 VIEW    TABLE_07    TABLE
VIEW_O4 VIEW    TABLE_08    TABLE

我想我还应该有一列列出起点,这样我就可以将祖先保留在一个组中。

我尝试了以下查询:

SELECT NAME, TYPE, REFERENCED_NAME, REFERENCED_TYPE
FROM DBA_DEPENDENCIES
WHERE OWNER='FOO'
AND NAME='VIEW_01'
CONNECT BY PRIOR REFERENCED_NAME=NAME

但我收到一条错误消息,显示为“ORA-01436:用户数据中的 CONNECT BY 循环”。我错过了什么?

【问题讨论】:

    标签: oracle oracle10g recursive-query


    【解决方案1】:

    您想在 CONNECT BY 之后指定 NOCYCLE 关键字:

    SELECT NAME, 
           TYPE, 
           REFERENCED_NAME, 
           REFERENCED_TYPE 
      FROM DBA_DEPENDENCIES 
     WHERE OWNER='FOO' 
       AND NAME='VIEW_01' 
    CONNECT BY NOCYCLE
      PRIOR REFERENCED_NAME = NAME;
    

    这里有关于 NOCYCLE 和“CONNECT_BY_ISCYCLE”关键字的更多信息: http://www.dba-oracle.com/t_advanced_sql_connect_by_loop.htm

    这里: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns001.htm

    希望对你有帮助...

    编辑:在 cmets 之后,您错过了 START WITH 子句。

    SELECT NAME, 
           TYPE, 
           REFERENCED_NAME, 
           REFERENCED_TYPE 
      FROM DBA_DEPENDENCIES 
     WHERE OWNER='FOO' 
     START WITH NAME='VIEW_01' 
    CONNECT BY NOCYCLE
      PRIOR REFERENCED_NAME = NAME;
    

    顺便说一句,保留 OWNER='FOO' where 子句将任何依赖项限制为仅返回 FOO 的对象,因此您可能会错过来自其他模式的依赖项。

    编辑 2: 视图表的主键是所有者,名称因此选择应该以两者开头并由两者连接。您可以使用 where 过滤掉所需的结果。

    SELECT OWNER, NAME, TYPE,  
       REFERENCED_OWNER,
       REFERENCED_NAME, 
       REFERENCED_TYPE 
    FROM DBA_DEPENDENCIES 
    -- where referenced_type='TABLE'
    START WITH owner = 'FOO' AND NAME='VIEW_01' 
    CONNECT BY NOCYCLE
       PRIOR REFERENCED_NAME = NAME
       AND PRIOR REFERENCED_OWNER = OWNER;
    

    【讨论】:

    • 我试过这个查询。从语法上讲,它是正确的,但查询永远不会完成。还有其他选择吗?
    • Craig,您需要指定 START WITH 子句,告诉查询从哪里开始它的层次结构。在您的 WHERE 子句中,将“AND NAME='VIEW_01'”更改为 START WITH 子句。
    • 好的,STARTS WITH 子句消除了这个问题。不幸的是,现在每一行都重复了两次。我将 SYS_CONNECT_BY_PATH (NAME,'/') 添加到 SELECT 子句中。除了路径为 /VIEW_01/[NAME] 的行之外,每条记录还包括路径 /VIEW_01/VIEW_01/[NAME]。想法?
    • 我现在不在我的测试框前面,但是如果您遇到重复行的问题,您可以使用 DISTINCT 关键字过滤它们。即选择 DISTINCT NAME、TYPE、REFERENCED_NAME...
    • 我考虑过,但我会丢失查询的 PATH 部分。理想情况下,我会消除奇怪的行为。
    【解决方案2】:

    正如奥利所说, 这是一样的:
    此查询解析所有以 MYPROC 作为树根开头的 deps。

    SELECT A.NAME,
       A.TYPE,
       A.REFERENCED_OWNER,
       A.REFERENCED_NAME,
       A.REFERENCED_TYPE,
       A.REFERENCED_LINK_NAME,
       A.SCHEMAID  FROM USER_DEPENDENCIES A
     CONNECT BY PRIOR REFERENCED_NAME = A.NAME
     START WITH A.NAME = 'MYPROC'ORDER BY 1, 2, 3, 4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多