Me gustaría una lista de las tablas dependientes (en última instancia) de una determinada vista.

Por ejemplo:

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

Los resultados:

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

Me gustaría que se asemejan a:

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

Supongo que yo también debería tener una columna que muestra el punto de partida, para que yo pueda seguir la ascendencia de un grupo.

He probado la siguiente consulta:

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

pero me da un error que dice «ORA-01436: CONECTAR en bucle en los datos del usuario’. Lo que me estoy perdiendo?

InformationsquelleAutor craig | 2011-10-17

2 Comentarios

  1. 3

    Desea especificar el NOCYCLE palabra clave después de su CONECTARSE POR:

    es decir,

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

    Hay más info en NOCYCLE y el «CONNECT_BY_ISCYCLE» aquí las palabras clave:
    http://www.dba-oracle.com/t_advanced_sql_connect_by_loop.htm

    y aquí:
    http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns001.htm

    Espero que ayude…

    EDIT: Después de los comentarios, que han perdido el INICIO de la cláusula.

    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;

    Por CIERTO, manteniendo el PROPIETARIO=’FOO’ cláusula where de los límites de las dependencias volvió a sólo FOO del objeto de modo que, posiblemente, puede miss dependencias de otros esquemas.

    Edit 2:
    La clave principal de una tabla de vista es propietario, nombre por lo tanto, al seleccionar debe comenzar con ambos y conectar por tanto. Usted puede utilizar donde para filtrar los resultados deseados.

    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;
    • Traté de esta consulta. Sintácticamente, es correcto, pero la consulta nunca se completa. ¿Hay otra opción?
    • Craig, usted necesita para especificar el INICIO CON la cláusula decirle a la consulta por donde empezar es la jerarquía. En la cláusula where cambiar la «Y NAME=’VIEW_01′» para EMPEZAR CON la cláusula.
    • OK, se INICIA CON la cláusula eliminado ese problema. Por desgracia, cada fila se repite dos veces. He añadido SYS_CONNECT_BY_PATH (NOMBRE,’/’) a la cláusula SELECT. Cada registro incluye una ruta de /VIEW_01/VIEW_01/[NOMBRE] además de una fila con una ruta de /VIEW_01/[NOMBRE]. Los pensamientos?
    • Yo no estoy delante de mi caja de prueba en el momento, pero si usted tiene un problema con filas duplicadas, puede filtrar con la palabra clave DISTINCT. es decir, SELECT DISTINCT NOMBRE, TIPO, REFERENCED_NAME…
    • He pensado que, pero me gustaría perder la RUTA parte de la consulta. Idealmente, me gustaría eliminar el comportamiento extraño.
    • Si la ruta es diferente, a continuación, los resultados no son duplicados. ¿Cuáles son las diferencias en los valores de RUTA? Es la consulta de búsqueda de sinónimos, etc.? Podría ser que usted necesita para filtrar los duplicados en una subconsulta antes, a continuación, utilizando la jerarquía de consulta para ordenar lo que queda.

  2. 0

    como Ollie dijo:
    Este es el mismo:

    Esta consulta se resuelve todos los deps de partida con MYPROC como raíz del árbol.

    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

Dejar respuesta

Please enter your comment!
Please enter your name here