Obtenir la liste de toutes les tables dans Oracle?

1102

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

vitule
la source
1
Est SHOW TABLES-ce que (comme dans MySQL) fonctionne?
Martin Thoma
1
@MartinThoma non. essayé avant de recourir à Google
Adam Burley

Réponses:

1364
SELECT owner, table_name
  FROM dba_tables

Cela suppose que vous avez accès à la DBA_TABLESvue du dictionnaire de données. Si vous ne disposez pas de ces privilèges mais en avez besoin, vous pouvez demander que le DBA vous accorde explicitement des privilèges sur cette table, ou que le DBA vous accorde le SELECT ANY DICTIONARYprivilège ou le SELECT_CATALOG_ROLErôle ( l' un ou l' autre vous permettant d'interroger n'importe quelle table de dictionnaire de données ). Bien sûr, vous voudrez peut-être exclure certains schémas comme SYSet SYSTEMqui ont un grand nombre de tables Oracle dont vous ne vous souciez probablement pas.

Alternativement, si vous n'y avez pas accès DBA_TABLES, vous pouvez voir toutes les tables auxquelles votre compte a accès via la ALL_TABLESvue:

SELECT owner, table_name
  FROM all_tables

Cependant, cela peut être un sous-ensemble des tables disponibles dans la base de données ( ALL_TABLESvous 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, pas de celles auxquelles vous avez accès, vous pouvez utiliser USER_TABLES:

SELECT table_name
  FROM user_tables

Puisqu'il USER_TABLESne contient que des informations sur les tables que vous possédez, il n'a pas de OWNERcolonne - le propriétaire, par définition, c'est vous.

Oracle a également un certain nombre de données existantes dictionnaire views-- TAB, DICT, TABSet CATpour exemple-- qui pourrait être utilisé. En général, je ne suggérerais pas d'utiliser ces vues héritées, sauf si vous devez absolument rétroporter vos scripts vers Oracle 6. Oracle n'a pas modifié ces vues depuis longtemps, de sorte qu'ils ont souvent des problèmes avec les nouveaux types d'objets. Par exemple, les TABet CATpoints de vue à la fois d'information montrent sur les tables qui se trouvent dans la corbeille de l'utilisateur tandis que les [DBA|ALL|USER]_TABLESvues tous les filtres out. CATaffiche également des informations sur les journaux de vues matérialisées avec un TABLE_TYPE"TABLE" qui ne correspond probablement pas à ce que vous voulez vraiment. DICTcombine des tableaux et des synonymes et ne vous dit pas à qui appartient l'objet.

Justin Cave
la source
9
Je reçois une exception "ORA-00942: la table ou la vue n'existe pas"
vitule
46
Ensuite, vous n'avez pas été autorisé à voir toutes les tables de la base de données. Vous pouvez interroger la vue du dictionnaire de données ALL_TABLES pour voir toutes les tables auxquelles vous êtes autorisé à accéder, qui peut être un petit sous-ensemble des tables de la base de données.
Justin Cave
Erreur simple si ce n'est pas un utilisateur sqlplus ordinaire: ajoutez le point-virgule de fin (';') si vous n'obtenez tout simplement pas de résultats avec les commandes ci-dessus :).
Gimhani
Juste une note qu'à partir d'Oracle 12c, il y a une colonne dans le dictionnaire de données dba_users pour aider à supprimer les tables système de votre jeu de résultats. La requête complète serait SELECT owner, table_name from dba_tables where owner not in (select username from dba_users where oracle_maintained = 'Y')
saritonin
181

Requête user_tableset dba_tablesn'a pas fonctionné.
Celui-ci a fait:

select table_name from all_tables  
vitule
la source
14
@LimitedAtonement Désolé, c'est tout à fait faux. La vue est appelée user_tables, pas user_table. Si user_tables ne fonctionnait pas pour vitule, quelque chose d'autre ne fonctionnait pas.
Frank Schmitt
67

Pour aller plus loin, il existe une autre vue appelée cols (all_tab_columns) qui peut être utilisée pour déterminer 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 rechercher toutes les tables dont le nom commence par EST et les colonnes contenant CALLREF n'importe où dans leur nom.

Cela peut vous aider lors de l'élaboration des colonnes sur lesquelles vous souhaitez vous joindre, par exemple, en fonction de vos conventions de dénomination de table et de colonne.

stealth_angoid
la source
4
J'ai fait select * from colset obtenu 0 lignes retournées.
Gabe
50

Pour une meilleure visualisation avec sqlplus

Si vous utilisez, sqlplusvous voudrez peut-être d'abord configurer quelques paramètres pour une meilleure visualisation si vos colonnes sont déformées (ces variables ne devraient pas persister après avoir quitté votre sqlplussession):

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

Afficher toutes les tables

Vous pouvez ensuite utiliser quelque chose comme ceci pour voir tous les noms de table:

SELECT table_name, owner, tablespace_name FROM all_tables;

Afficher les tableaux que vous possédez

Comme le mentionne @Justin Cave, vous pouvez l'utiliser pour afficher uniquement les tables dont vous êtes propriétaire:

SELECT table_name FROM user_tables;

N'oubliez pas les vues

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

SELECT view_name FROM all_views;

Les resultats

Cela devrait produire quelque chose qui semble assez acceptable comme:

résultat

cwd
la source
8
merci pour le "meilleur visionnage" des conseils, mais ne remplacez-vous pas pagesize 30avec pagesize 1000?
Pablo Recalde
22

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

  SELECT table_name FROM user_tables;
Israël Margulies
la source
18
    select object_name from user_objects where object_type='TABLE';

----------------OU------------------

    select * from tab;

----------------OU------------------

    select table_name from user_tables;
Harshil
la source
15

Essayez les vues du dictionnaire de données ci-dessous.

tabs
dba_tables
all_tables
user_tables
Mahmoud Ahmed El-Sayed
la source
9

Essayez de sélectionner parmi user_tables qui répertorie les tables appartenant à l'utilisateur actuel.

Eddie Awad
la source
8

Avec n'importe lequel d'entre eux, vous pouvez sélectionner:

SELECT DISTINCT OWNER, OBJECT_NAME 
    FROM DBA_OBJECTS 
    WHERE OBJECT_TYPE = 'TABLE' AND OWNER='SOME_SCHEMA_NAME';

SELECT DISTINCT OWNER, OBJECT_NAME 
    FROM ALL_OBJECTS 
    WHERE OBJECT_TYPE = 'TABLE' AND OWNER='SOME_SCHEMA_NAME';
Van Gogh
la source
6
select * from dba_tables

donne toutes les tables de tous les utilisateurs uniquement si l'utilisateur avec lequel vous vous êtes connecté a les sysdbaprivilèges.

praveen2609
la source
4
Ce n'est en fait pas correct. SYSDBA n'est pas requis. Vous pouvez accéder à DBA_TABLES de plusieurs manières. 1.) Accord direct sur l'objet à l'utilisateur par SYS. 2.) Octroi du privilège SELECT ANY DICTIONARY à l'utilisateur. 3.) Octroi du rôle SELECT_CATALOG_ROLE.
Mark J. Bobak
4

Je n'ai pas trouvé de réponse qui indiquerait à utiliser

DBA_ALL_TABLES (ALL_ALL_TABLES/USER_ALL_TABLES)

J'ai donc décidé d'ajouter ma version également. Cette vue renvoie en fait plus que DBA_TABLES car elle renvoie également des tables d'objets ( http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_1003.htm ).

Rouillé
la source
4

Vous pouvez utiliser Oracle Data Dictionary pour obtenir des informations sur les objets Oracle.

Vous pouvez obtenir la liste des tableaux de différentes manières:

select * 
from dba_tables

ou par exemple:

select * 
from dba_objects 
where object_type = 'TABLE' 

Ensuite, vous pouvez obtenir des colonnes de table en utilisant le nom de table:

select * 
from dba_tab_columns

Ensuite, vous pouvez obtenir la liste des dépendances (déclencheurs, vues, etc.):

select * 
from dba_dependencies
where referenced_type='TABLE' and referenced_name=:t_name 

Ensuite, vous pouvez obtenir la source de texte de ces objets:

select * from dba_source

Et vous pouvez utiliser USERou des ALLvues au lieu de DBAsi vous le souhaitez.

Slava Babin
la source
4

Y compris les vues:

SELECT owner, table_name as table_view
  FROM dba_tables
UNION ALL
SELECT owner, view_name as table_view
  FROM DBA_VIEWS
Punnerud
la source
4

Nous pouvons obtenir tous les tableaux, y compris les détails des colonnes de la requête ci-dessous:

SELECT * FROM user_tab_columns;
aim_thebest
la source
4

Vous trouverez ci-dessous un extrait commenté de requêtes SQL décrivant comment vous pouvez utiliser les options:

-- need to have select catalog role
SELECT * FROM dba_tables;

-- to see tables of your schema
SELECT * FROM user_tables;

-- tables inside your schema and tables of other schema which you possess select grants on
SELECT * FROM all_tables;
Prashant Mishra
la source
2

La requête suivante ne répertorie que les données requises, tandis que les autres réponses m'ont donné les données supplémentaires qui n'ont fait que me confondre.

select table_name from user_tables;
Mateen
la source
2

Une nouvelle fonctionnalité disponible dans SQLcl (qui est une interface de ligne de commande gratuite pour Oracle Database) est

Tables alias.

Voici quelques exemples montrant l'utilisation et les aspects supplémentaires de la fonctionnalité. Tout d'abord, connectez-vous à une session de sqlligne de commande ( sql.exesous Windows). Il est recommandé d'entrer cette commande spécifique sqlcl avant d'exécuter toute autre commande ou requête qui affiche des données.

SQL> set sqlformat ansiconsole     -- resizes the columns to the width of the 
                                   -- data to save space 

SQL> tables

TABLES
-----------
REGIONS
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
..

Pour savoir à quoi tablesfait référence l' alias, vous pouvez simplement utiliseralias list <alias>

SQL> alias list tables
tables - tables <schema> - show tables from schema
--------------------------------------------------

 select table_name "TABLES" from user_tables

Vous n'avez pas besoin de définir cet alias car il vient par défaut sous SQLcl. Si vous souhaitez répertorier les tables d'un schéma spécifique, en utilisant un nouvel alias défini par l'utilisateur et en passant le nom du schéma comme argument de liaison avec uniquement un ensemble de colonnes affichées, vous pouvez le faire en utilisant

SQL> alias tables_schema = select owner, table_name, last_analyzed from all_tables where owner = :ownr;

Ensuite, vous pouvez simplement passer le nom du schéma comme argument

SQL> tables_schema HR

OWNER   TABLE_NAME               LAST_ANALYZED
HR      DUMMY1                   18-10-18
HR      YOURTAB2                 16-11-18
HR      YOURTABLE                01-12-18
HR      ID_TABLE                 05-12-18
HR      REGIONS                  26-05-18
HR      LOCATIONS                26-05-18
HR      DEPARTMENTS              26-05-18
HR      JOBS                     26-05-18
HR      EMPLOYEES                12-10-18
..
..

Un alias prédéfini plus sophistiqué est appelé Tables2, qui affiche plusieurs autres colonnes.

SQL> tables2

Tables
======
TABLE_NAME                 NUM_ROWS   BLOCKS   UNFORMATTED_SIZE COMPRESSION     INDEX_COUNT   CONSTRAINT_COUNT   PART_COUNT LAST_ANALYZED
AN_IP_TABLE                       0        0                  0 Disabled                  0                  0            0 > Month
PARTTABLE                         0        0                  0                           1                  0            1 > Month
TST2                              0        0                  0 Disabled                  0                  0            0 > Month
TST3                              0        0                  0 Disabled                  0                  0            0 > Month
MANAGE_EMPLYEE                    0        0                  0 Disabled                  0                  0            0 > Month
PRODUCT                           0        0                  0 Disabled                  0                  0            0 > Month
ALL_TAB_X78EHRYFK                 0        0                  0 Disabled                  0                  0            0 > Month
TBW                               0        0                  0 Disabled                  0                  0            0 > Month
DEPT                              0        0                  0 Disabled                  0                  0            0 > Month

Pour savoir quelle requête il exécute en arrière-plan, entrez

alias list tables2

Cela vous montrera une requête légèrement plus complexe ainsi que des columndéfinitions prédéfinies couramment utilisées dans SQL * Plus.

Jeff Smith explique plus sur les alias ici

Kaushik Nayak
la source
1

Je cherchais à obtenir une liste de tous les noms de colonnes appartenant à une table d'un schéma trié par ordre d'ID de colonne.

Voici la requête que j'utilise: -

SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'schema_owner_username' AND TABLE_NAME='table_name'
ORDER BY COLUMN_ID ASC;
Rakesh Narang
la source
1

En effet, il est possible d'avoir la liste des tables via SQL queries.it est possible de le faire aussi via des outils qui permettent la génération de dictionnaires de données, tels que ERWIN , Toad Data Modeler ou ERBuilder . Avec ces outils, en plus des noms de table, vous aurez des champs, leurs types, des objets comme (triggers, séquences, domaine, vues ...)

Ci-dessous les étapes à suivre pour générer votre définition de tables:

  1. Vous devez inverser l'ingénierie de votre base de données
    • Dans Toad data modeler: Menu -> Fichier -> reverse engineering -> assistant de reverse engineering
    • Dans ERBuilder Data Modeler: Menu -> File -> reverse engineering

Votre base de données sera affichée dans le logiciel sous forme de diagramme de relation d'entité.

  1. Générez votre dictionnaire de données qui contiendra votre définition de tables
    • Dans Toad data modeler: Menu -> Model -> Generate report -> Run
    • Dans ERBuilder Data Modeler: Menu -> Tool -> Générer la documentation du modèle
parash
la source
0
select * from all_all_tables

ce «tout» supplémentaire au début donne 3 colonnes supplémentaires qui sont:

OBJECT_ID_TYPE
TABLE_TYPE_OWNER
TABLE_TYPE
Faites avec
la source
Identique à cette réponse , non?
mustaccio