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;)
ce que tu veux dire par « nom de tables utilisateur »? – rogeriopvl
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