2008-12-10 7 views
3

Existe-t-il une commande dans Oracle 9i qui affiche les clés étrangères d'une table ainsi que la table référencée par ces clés étrangères?Affichage des relations de clé étrangère dans Oracle 9i

je cherchais, n'a rien trouvé, mais je l'ai trouvé une commande équivalente qui fonctionne avec MySql qui est SHOW CREATE TABLE

Y at-il une commande équivalente pour cela dans SQL d'Oracle?

J'apprécie votre réponse, mais je pensais qu'il y avait un moyen très court de le faire comme MySql.

Répondre

1

Cela peut faire ce que vous voulez, il utilise les vues système Oracle. Cependant, je n'ai pas d'instance Oracle à portée de main pour le tester.

SELECT fk.owner, fk.constraint_name, fk.table_name, fc.column_name, 
    pk.owner, pk.constraint_name, pk.table_name, pc.column_name 
FROM all_constraints fk 
JOIN all_cons_columns fc ON (fk.owner = fc.owner AND fk.constraint_name = fc.constraint_name) 
JOIN (all_constraints pk 
    JOIN all_cons_columns pc ON (pk.owner = pc.owner AND pk.constraint_name = pc.constraint_name)) 
ON (fk.r_owner = pk.owner AND fk.r_constraint_name = pk.constraint_name 
    AND fc.position = pc.position) 
WHERE fk.constraint_type = 'R' AND pk.constraint_type IN ('P', 'U') 
    AND fk.owner = '<schema>' AND fk.table_name = '<table>'; 
+0

Yeesh ... vous essayez d'aider, et voyez ce que vous obtenez. –

+0

J'ai le message d'erreur suivant: ERREUR à la ligne 7: ORA-25154: partie de colonne de la clause USING ne peut pas avoir qualificatif –

+0

Je vais réécrire cela avec la syntaxe ON au lieu de l'utilisation. –

2

Vous pourriez commencer par la liste de toutes les contraintes de la table ainsi que toute contrainte référencée sur d'autres tables:

SELECT 
    acc.table_name 
    ,acc.column_name 
    ,acc.constraint_name 
    ,ac.r_constraint_name AS referenced_constraint 
FROM all_cons_columns acc 
INNER JOIN all_constraints ac ON (acc.constraint_name = ac.constraint_name) 
WHERE acc.table_name = UPPER('your_table_here'); 

Si vous avez des conventions de nommage sensibles pour vos contraintes, il devrait être possible d'identifier qui sont les clés étrangères, un préfixe/suffixe 'FK' est typique.

+0

J'ai reçu: aucune ligne sélectionnée Et j'ai entré un nom de table correct. –

+0

Je l'ai mis à jour pour utiliser all_constraints plutôt que user_constraints, essayez cela pour la taille – ninesided

4

Voici une autre réponse: Le package dbms_metadata dispose d'une fonction qui peut renvoyer le DDL pour une définition de table.

SELECT dbms_metadata.get_ddl('TABLE', '<table>', '<schema>') FROM dual; 

Ce paquet a apparemment disponible depuis Oracle 9,2

http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96612/d_metada.htm#1656

+0

J'ai un très long message d'erreur qui commence par: ORA-31603: objet "enregistrement" de type TABLE non trouvé dans le schéma "tset" Je pense que c'est peut-être parce qu'im utilisant Oracle 9i –

+1

J'ai vu un message de forum Oracle qui suggère que vous devez créer la procédure get_ddl() dans le schéma SYS pour qu'il ait les bons privilèges pour les métadonnées du système. –

+0

Les noms sont sensibles à la casse ici, et sont stockés en majuscules sauf si explicitement cité. Donc, l'enregistrement et le TSET (ou devrait-il être TEST) peuvent fonctionner. –

0

Si vous avez besoin pour les clés DDL étrangères à l'avenir, est ici la réponse à l'avance :)

select 
    DBMS_METADATA.GET_DEPENDENT_DDL('REF_CONSTRAINT' ,atb.table_name, atb.owner) 
from 
    all_tables atb, all_constraints ac 
where 
    atb.owner = ac.owner and 
    ac.constraint_type = 'R' and 
    ac.table_name = atb.table_name and 
    atb.owner = 'YOURSCHEMA'; 
Questions connexes