2009-08-24 12 views
2

Je me demandais comment puis-je lister le nom des tables utilisateur avec son nom de clé primaire comme deuxième colonne?Obtenir le nom de la clé primaire de la table

Je fais la moitié du travail mais je ne sais pas quoi faire de plus.

select table_name from user_tables ORDER BY (table_name) ASC 

Est-ce que quelqu'un sait comment?

Merci

+0

ce que tu veux dire par « nom de tables utilisateur »? – rogeriopvl

+0

Les noms des tables créées par un utilisateur spécifique (je travaille avec Oracle pour créer quelque chose comme un schéma par utilisateur). – Sheldon

Répondre

3

Cette simple requête vous donne une liste de tables ainsi que le nom de contrainte PK (mais pas le nom de la colonne):

select  ut.table_name, uc.constraint_name 
from  user_tables ut 
left join user_constraints uc 
    on  ut.table_name = uc.table_name 
    and  uc.constraint_type = 'P'; 

Si vous voulez que le nom de la colonne, rappelez-vous qu'un PK peut avoir plusieurs colonnes! Nous devons créer un type utilitaire d'abord en raison de la fonction d'agrégation Collect():

create type ty_varchar_nt as table of varchar2(4000); 

select  ut.table_name, uc.constraint_name, cast(collect (uic.column_name) as ty_varchar_nt) as pk_cols 
from  user_tables ut 
left join user_constraints uc 
    on  ut.table_name = uc.table_name 
    and  uc.constraint_type = 'P' 
left join user_ind_columns uic 
    on  uc.index_name = uic.index_name 
group by ut.table_name, uc.constraint_name; 

Si vous ne souhaitez pas la mise en forme de l'onglet imbriqué, vous pouvez écrire une fonction utilitaire qui prendra un NT en entrée et fournit une chaîne délimitée par des virgules concaténée en sortie. Il suffit de ne pas avoir le temps de le faire moi-même;)

1

essayez de joindre USER_TABLES avec user_constraints.

Dans USER_CONSTRAINTS filtre toutes les lignes avec type_contrainte est égal à 'P' (clé primaire). Là, vous obtiendrez index_name et index_owner valeurs que vous pourriez rejoindre avec USER_INDEXES et obtenir des noms de colonnes à partir de votre clé PRIMARY.

Je voudrais savoir une façon plus directe de faire cela ... Mais je ne le fais pas.

Bonne chance!

1

vous pouvez utiliser la requête suivante

SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner 
FROM all_constraints cons, all_cons_columns cols 
WHERE cons.constraint_type = 'P' 
AND cons.constraint_name = cols.constraint_name 
AND cons.owner = cols.owner 
ORDER BY cols.table_name, cols.position; 
Questions connexes