Obtenir la liste de toutes les tables dans Oracle ?

Comment interroger une base de données Oracle pour afficher les noms de toutes les tables qu'elle contient ?

Solution
SELECT owner, table_name
  FROM dba_tables

Ceci suppose que vous ayez accès à la vue du dictionnaire de données DBA_TABLES. Si vous n'avez pas ces privilèges mais que vous en avez besoin, vous pouvez demander au DBA de vous accorder explicitement des privilèges sur cette table, ou, que le DBA vous accorde le privilège SELECT ANY DICTIONARY ou le rôle SELECT_CATALOG_ROLE (l'un ou l'autre vous permettant d'interroger n'importe quelle table du dictionnaire de données). Bien sûr, vous pouvez vouloir exclure certains schémas comme SYS et SYSTEM qui ont un grand nombre de tables Oracle dont vous ne vous souciez probablement pas.

Alternativement, si vous n'avez pas accès à DBA_TABLES, vous pouvez voir toutes les tables auxquelles votre compte a accès grâce à la vue ALL_TABLES :

SELECT owner, table_name
  FROM all_tables

Bien que cela puisse être un sous-ensemble des tables disponibles dans la base de données (ALL_TABLES vous montre les informations pour toutes les tables auxquelles votre utilisateur a été autorisé à accéder).

Si vous ne vous intéressez qu'aux tables que vous possédez, et non à celles auxquelles vous avez accès, vous pouvez utiliser USER_TABLES :

SELECT table_name
  FROM user_tables

Puisque USER_TABLES ne contient que des informations sur les tables que vous possédez, il n'y a pas de colonne OWNER - le propriétaire, par définition, c'est vous.

Oracle a également un certain nombre de vues de dictionnaire de données - TAB, DICT, TABS, et CAT par exemple - qui pourraient être utilisées. En général, je ne suggérerais pas d'utiliser ces anciennes vues à moins que vous n'ayez absolument besoin de rétroporter vos scripts vers Oracle 6. Oracle n'a pas modifié ces vues depuis longtemps et elles ont souvent des problèmes avec les nouveaux types d'objets. Par exemple, les vues TAB et CAT montrent toutes deux des informations sur les tables qui sont dans la corbeille de l'utilisateur alors que les vues [DBA|ALL|USER]_TABLES les filtrent toutes. CAT affiche également des informations sur les journaux de vues matérialisées avec un TABLE_TYPE de "TABLE", ce qui n'est probablement pas ce que vous voulez vraiment. DICT combine les tables et les synonymes et ne vous dit pas qui possède l'objet.

Commentaires (6)

L'interrogation de user_tables et dba_tables ne fonctionne pas.
Celle-ci a fonctionné :

select table_name from all_tables  
Commentaires (1)

Essayez de faire une sélection à partir de user_tables qui liste les tables appartenant à l'utilisateur actuel.

Commentaires (0)