Ver Mensaje Individual
  #2 (permalink)  
Antiguo 31/01/2011, 09:38
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Construir una query para obtener FK

Hola guardianglorioso:

Para obtener la información que necesitas deberás consultar tres tablas de catálogos:

ALL_CONSTRAINTS: Almacena todas las restricciones de la BD, en tu caso como lo que quieres revisar son las restricciones tipo llave foránea deberás especificar R como constraint_type (Puedes ver más informacíon acerca de esta tabla y los tipos de constraint que almacena Aquí.

ALL_CONS_COLUMNS: almacena la información de las columnas que están involucradas en la restricción. existe una referencia doble con la tabla ALL_CONSTRAINTS. una está dada por el campo constraint_name y la otra por el campo r_constraint_name. Más información Aquí

ALL_TAB_COLUMNS: contiene la definición, tipo de dato, longitud, precisión, etc. para cada columna. Más información Aquí.

De tal manera que si tuvieras una tabla EMPLEADOS que tiene una restricción con la tabla ESTADOS_CIVILES, en su campo idEstadoCivil podrías hacer algo como esto:

Código SQL:
Ver original
  1. SELECT
  2. t1.constraint_name AS CONSTRAINT,
  3. t2.TABLE_NAME AS TablaOrigen,
  4. t2.column_name AS CampoOrigen,
  5. t3.TABLE_NAME AS TablaReferencia,
  6. t2.column_name AS CampoReferencia
  7. FROM all_constraints t1
  8. INNER JOIN all_cons_columns t2
  9. ON t2.constraint_name = t1.constraint_name AND t2.owner = t1.owner
  10. INNER JOIN all_cons_columns t3
  11. ON T3.constraint_name = t1.r_constraint_name AND t3.owner = t1.owner
  12. WHERE
  13. t1.constraint_type = 'R' AND
  14. t2.POSITION = t3.POSITION AND
  15. t1.TABLE_NAME LIKE 'EMPLEADOS';

Esto te regresaría algo esto:

Código:
Constraint|TablaOrigen|CampoOrigen|TablaReferencia|CampoReferencia 
-----------------------------------------------------------------------------------------------------
EMP_EDO_CIVIL_FK|EMPLEADOS|idEstadoCivil|ESTADOS_CIVILES|idEstadoCivil
Lo único que tienes que agregar a la consulta sería la tabla ALL_TAB_COLUMNS para obtener el tipo de cada uno de los campos. Intenta hacerlo y si tienes problemas lo comentas en el foro.

Saludos
Leo.