Comment interroger une base de données Oracle pour afficher les noms de toutes les tables qu'elle contient ?
Je reçois une exception "ORA-00942 : table ou vue n'existe pas".
Comment interroger une base de données Oracle pour afficher les noms de toutes les tables qu'elle contient ?
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.
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.
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 :).
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.
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
Vous pouvez alors utiliser quelque chose comme ceci pour voir tous les noms de tables :
SELECT table_name, owner, tablespace_name FROM all_tables;
Comme le mentionne @Justin Cave, vous pouvez l'utiliser pour afficher uniquement les tables que vous possédez :
SELECT table_name FROM user_tables;
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;
Cela devrait donner quelque chose d'assez acceptable :
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.
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.