1156 votes

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 ?

1 votes

Fait SHOW TABLES (comme cela se fait dans MySQL) fonctionne ?

1 votes

@MartinThoma non. J'ai d'abord essayé cela, avant de recourir à Google.

1417voto

Justin Cave Points 114578
SELECT owner, table_name
  FROM dba_tables

Ceci en supposant que vous avez accès à la base de données de l'entreprise. DBA_TABLES vue du dictionnaire de données. Si vous ne disposez pas de 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 bien, que le DBA vous accorde les privilèges suivants SELECT ANY DICTIONARY le privilège ou le SELECT_CATALOG_ROLE (l'un ou l'autre vous permettant d'interroger n'importe quelle table du dictionnaire de données). Bien entendu, vous pouvez vouloir exclure certains schémas tels que SYS y 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 par l'intermédiaire de l'interface de l'utilisateur. ALL_TABLES vue :

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 préoccupez que des tables que vous possédez, et non de celles auxquelles vous avez accès, vous pouvez utiliser la méthode suivante USER_TABLES :

SELECT table_name
  FROM user_tables

Depuis USER_TABLES ne dispose que d'informations sur les tables que vous possédez, il ne dispose pas d'une OWNER colonne - le propriétaire, par définition, c'est vous.

Oracle dispose également d'un certain nombre de vues de dictionnaire de données anciennes TAB , DICT , TABS y CAT par exemple - qui pourraient être utilisées. En général, je ne suggère pas d'utiliser ces vues héritées, à 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, la vue TAB y CAT montrent toutes deux des informations sur les tables qui se trouvent dans la corbeille de l'utilisateur, tandis que la vue [DBA|ALL|USER]_TABLES les vues filtrent toutes ces éléments. CAT montre aussi 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 des tables et des synonymes et ne vous dit pas qui possède l'objet.

9 votes

Je reçois une exception "ORA-00942 : table ou vue n'existe pas".

47 votes

Dans ce cas, vous n'avez pas été autorisé à voir toutes les tables de la base de données. Vous pouvez interroger la vue ALL_TABLES du dictionnaire de données pour voir toutes les tables auxquelles vous êtes autorisé à accéder, ce qui peut être un petit sous-ensemble des tables de la base de données.

0 votes

Une erreur simple si vous n'êtes pas un utilisateur quotidien de sqlplus : ajoutez le point-virgule final (';') si vous n'obtenez pas de résultats avec les commandes ci-dessus :).

187voto

vitule Points 3464

Interrogation de user_tables y dba_tables n'a pas fonctionné.
Celui-ci l'a fait :

select table_name from all_tables

14 votes

@LimitedAtonement Désolé, c'est tout simplement faux. La vue s'appelle user_tables, pas user_table. Si user_tables n'a pas fonctionné pour vitule, il y a quelque chose d'autre qui cloche.

67voto

stealth_angoid Points 429

Pour aller plus loin, il existe une autre vue appelée cols (all_tab_columns) qui peut être utilisée pour vérifier quelles tables contiennent un nom de colonne donné.

Par exemple :

SELECT table_name, column_name
FROM cols
WHERE table_name LIKE 'EST%'
AND column_name LIKE '%CALLREF%';

pour trouver toutes les tables dont le nom commence par EST et dont les colonnes contiennent CALLREF n'importe où dans leur nom.

Cela peut être utile pour déterminer les colonnes sur lesquelles vous souhaitez effectuer une jointure, par exemple, en fonction de vos conventions de dénomination des tables et des colonnes.

4 votes

Je l'ai fait. select * from cols et j'ai obtenu 0 ligne en retour.

55voto

cwd Points 8723

Pour une meilleure visualisation avec sqlplus

Si vous utilisez sqlplus vous pouvez d'abord définir quelques paramètres pour une meilleure visualisation si vos colonnes sont mélangées (ces variables ne doivent pas persister après que vous ayez quitté l'interface de l'application sqlplus session ) :

set colsep '|'
set linesize 167
set pagesize 30
set pagesize 1000

Afficher tous les tableaux

Vous pouvez alors utiliser quelque chose comme ceci pour voir tous les noms de tables :

SELECT table_name, owner, tablespace_name FROM all_tables;

Afficher les tables que vous possédez

Comme le mentionne @Justin Cave, vous pouvez l'utiliser pour afficher uniquement les tables que vous possédez :

SELECT table_name FROM user_tables;

N'oubliez pas les vues

Gardez à l'esprit que certaines "tables" peuvent être en fait des "vues", vous pouvez donc aussi essayer d'exécuter quelque chose comme :

SELECT view_name FROM all_views;

Les résultats

Cela devrait donner quelque chose d'assez acceptable :

result

8 votes

Merci pour le conseil "meilleure visualisation", mais n'écrivez-vous pas trop ? pagesize 30 con pagesize 1000 ?

22voto

Israel Margulies Points 1713

Requête simple pour sélectionner les tables pour l'utilisateur actuel :

  SELECT table_name FROM user_tables;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X