Liste aller Tabellen in Oracle abrufen?

1102

Wie frage ich eine Oracle-Datenbank ab, um die Namen aller darin enthaltenen Tabellen anzuzeigen?

Vitule
quelle
1
Funktioniert SHOW TABLES(wie in MySQL)?
Martin Thoma
1
@ MartinThoma nein. versuchte das zuerst, bevor er auf Google zurückgriff
Adam Burley

Antworten:

1364
SELECT owner, table_name
  FROM dba_tables

Dies setzt voraus, dass Sie Zugriff auf die DBA_TABLESDatenwörterbuchansicht haben. Wenn Sie nicht über diese Berechtigungen verfügen, diese aber benötigen, können Sie anfordern, dass der DBA Ihnen explizit Berechtigungen für diese Tabelle gewährt, oder dass der DBA Ihnen die SELECT ANY DICTIONARYBerechtigungen oder die SELECT_CATALOG_ROLERolle gewährt (beide ermöglichen es Ihnen, eine beliebige Datenwörterbuchtabelle abzufragen ). Natürlich möchten Sie möglicherweise bestimmte Schemas wie SYSund SYSTEMmit einer großen Anzahl von Oracle-Tabellen ausschließen, die Sie wahrscheinlich nicht interessieren.

Wenn Sie keinen Zugriff haben DBA_TABLES, können Sie alternativ alle Tabellen ALL_TABLESanzeigen , auf die Ihr Konto über die Ansicht Zugriff hat :

SELECT owner, table_name
  FROM all_tables

Dies kann jedoch eine Teilmenge der in der Datenbank verfügbaren Tabellen sein ( ALL_TABLESzeigt Ihnen die Informationen für alle Tabellen, auf die Ihr Benutzer Zugriff hat).

Wenn Sie sich nur mit den Tabellen befassen, die Sie besitzen, und nicht mit denen, auf die Sie Zugriff haben, können Sie Folgendes verwenden USER_TABLES:

SELECT table_name
  FROM user_tables

Da USER_TABLESnur Informationen zu den Tabellen vorhanden sind, die Sie besitzen, gibt es keine OWNERSpalte - der Eigentümer sind per Definition Sie.

Oracle hat auch eine Reihe von Altdaten Wörterbuch views-- TAB, DICT, TABS, und CATfür example-- die verwendet werden könnten. Im Allgemeinen würde ich nicht empfehlen, diese älteren Ansichten zu verwenden, es sei denn, Sie müssen Ihre Skripte unbedingt auf Oracle 6 zurückportieren. Oracle hat diese Ansichten seit langem nicht mehr geändert, sodass sie häufig Probleme mit neueren Objekttypen haben. Beispielsweise zeigen die Ansichten TABund CATbeide Informationen zu Tabellen an, die sich im Papierkorb des Benutzers befinden, während die [DBA|ALL|USER]_TABLESAnsichten alle diese herausfiltern. CATAußerdem werden Informationen zu materialisierten Ansichtsprotokollen mit TABLE_TYPE"TABLE" angezeigt, die wahrscheinlich nicht Ihren Wünschen entsprechen. DICTkombiniert Tabellen und Synonyme und sagt Ihnen nicht, wem das Objekt gehört.

Justin Cave
quelle
9
Ich erhalte eine Ausnahme "ORA-00942: Tabelle oder Ansicht existiert nicht"
Vitule
46
Dann haben Sie nicht die Berechtigung erhalten, alle Tabellen in der Datenbank anzuzeigen. Sie können die Datenwörterbuchansicht ALL_TABLES abfragen, um alle Tabellen anzuzeigen, auf die Sie zugreifen dürfen. Dies kann eine kleine Teilmenge der Tabellen in der Datenbank sein.
Justin Cave
Einfacher Fehler, wenn Sie kein alltäglicher sqlplus-Benutzer sind: Fügen Sie das End-Semikolon (';') hinzu, wenn Sie mit den obigen Befehlen keine Ergebnisse erzielen :).
Gimhani
Nur ein Hinweis, dass ab Oracle 12c eine Spalte im Datenwörterbuch dba_users vorhanden ist, mit deren Hilfe Systemtabellen aus Ihrer Ergebnismenge entfernt werden können. Die vollständige Abfrage wäre SELECT Eigentümer, Tabellenname von dba_tables, wo Eigentümer nicht in (wählen Sie Benutzername von dba_users, wo oracle_maintained = 'Y')
Saritonin
181

Abfragen user_tablesund dba_tablesnicht funktioniert.
Dieser tat:

select table_name from all_tables  
Vitule
quelle
14
@LimitedAtonement Sorry, das ist einfach falsch. Die Ansicht heißt user_tables, nicht user_table. Wenn user_tables für vitule nicht funktionierte, stimmte etwas anderes nicht.
Frank Schmitt
67

Wenn Sie noch einen Schritt weiter gehen, gibt es eine andere Ansicht namens cols (all_tab_columns), mit der Sie feststellen können, welche Tabellen einen bestimmten Spaltennamen enthalten.

Zum Beispiel:

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

um alle Tabellen zu finden, deren Name mit EST beginnt, und Spalten, die CALLREF an einer beliebigen Stelle in ihren Namen enthalten.

Dies kann hilfreich sein, wenn Sie herausfinden möchten, an welchen Spalten Sie teilnehmen möchten, z. B. abhängig von Ihren Namenskonventionen für Tabellen und Spalten.

stealth_angoid
quelle
4
Ich habe select * from cols0 Zeilen zurückgegeben.
Gabe
50

Zur besseren Anzeige mit sqlplus

Wenn Sie verwenden sqlplus, möchten Sie möglicherweise zuerst einige Parameter für eine bessere Anzeige einrichten, wenn Ihre Spalten beschädigt werden (diese Variablen sollten nach dem Beenden Ihrer sqlplusSitzung nicht bestehen bleiben ):

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

Alle Tabellen anzeigen

Sie können dann so etwas verwenden, um alle Tabellennamen anzuzeigen:

SELECT table_name, owner, tablespace_name FROM all_tables;

Zeigen Sie Ihre eigenen Tabellen an

Wie @Justin Cave erwähnt, können Sie damit nur Tabellen anzeigen, die Sie besitzen:

SELECT table_name FROM user_tables;

Vergessen Sie nicht die Ansichten

Beachten Sie, dass einige "Tabellen" tatsächlich "Ansichten" sein können, sodass Sie auch versuchen können, Folgendes auszuführen:

SELECT view_name FROM all_views;

Die Ergebnisse

Dies sollte etwas ergeben, das ziemlich akzeptabel aussieht wie:

Ergebnis

cwd
quelle
8
Danke für den Rat „besser sehen“, aber sie ist nicht overwritting pagesize 30mit pagesize 1000?
Pablo Recalde
22

Einfache Abfrage zum Auswählen der Tabellen für den aktuellen Benutzer:

  SELECT table_name FROM user_tables;
Israel Margulies
quelle
18
    select object_name from user_objects where object_type='TABLE';

----------------ODER------------------

    select * from tab;

----------------ODER------------------

    select table_name from user_tables;
Harshil
quelle
15

Probieren Sie die folgenden Datenwörterbuchansichten aus.

tabs
dba_tables
all_tables
user_tables
Mahmoud Ahmed El-Sayed
quelle
9

Versuchen Sie, aus user_tables auszuwählen, in denen die Tabellen aufgelistet sind, deren Eigentümer der aktuelle Benutzer ist.

Eddie Awad
quelle
8

Mit einem dieser Optionen können Sie Folgendes auswählen:

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
quelle
6
select * from dba_tables

Gibt alle Tabellen aller Benutzer nur an, wenn der Benutzer, mit dem Sie sich angemeldet haben, über die sysdbaBerechtigungen verfügt.

praveen2609
quelle
4
Das stimmt eigentlich nicht. SYSDBA ist nicht erforderlich. Sie können auf viele Arten auf DBA_TABLES zugreifen. 1.) Direkte Gewährung eines Objekts an den Benutzer durch SYS. 2.) Gewährung des SELECT ANY DICTIONARY-Privilegs an den Benutzer. 3.) Gewährung der Rolle SELECT_CATALOG_ROLE.
Mark J. Bobak
4

Ich habe keine Antwort gefunden, die darauf hindeuten würde, sie zu verwenden

DBA_ALL_TABLES (ALL_ALL_TABLES/USER_ALL_TABLES)

Also habe ich beschlossen, auch meine Version hinzuzufügen. Diese Ansicht gibt tatsächlich mehr als DBA_TABLES zurück, da sie auch Objekttabellen zurückgibt ( http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_1003.htm ).

rostig
quelle
4

Sie können Oracle Data Dictionary verwenden , um Informationen zu Oracle-Objekten abzurufen.

Sie können eine Liste von Tabellen auf verschiedene Arten erhalten:

select * 
from dba_tables

oder zum Beispiel:

select * 
from dba_objects 
where object_type = 'TABLE' 

Dann können Sie Tabellenspalten unter Verwendung des Tabellennamens erhalten:

select * 
from dba_tab_columns

Dann können Sie eine Liste der Abhängigkeiten (Trigger, Ansichten usw.) erhalten:

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

Dann können Sie die Textquelle dieser Objekte erhalten:

select * from dba_source

Und Sie können USERoder ALLAnsichten anstelle von verwenden, DBAwenn Sie möchten.

Slava Babin
quelle
4

Einschließlich Ansichten:

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

Wir können alle Tabellen einschließlich der Spaltendetails aus der folgenden Abfrage abrufen:

SELECT * FROM user_tab_columns;
aim_thebest
quelle
4

Unten finden Sie einen kommentierten Ausschnitt aus SQL-Abfragen, in dem beschrieben wird, wie Sie Optionen verwenden können:

-- 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
quelle
2

Die folgende Abfrage listet nur die erforderlichen Daten auf, während die anderen Antworten mir die zusätzlichen Daten gaben, die mich nur verwirrten.

select table_name from user_tables;
Mateen
quelle
2

Eine neue Funktion in SQLcl (einer kostenlosen Befehlszeilenschnittstelle für Oracle Database) ist

Tables alias.

Hier sind einige Beispiele, die die Verwendung und zusätzliche Aspekte der Funktion zeigen. Stellen Sie zunächst eine Verbindung zu einer sqlBefehlszeilensitzung ( sql.exein Windows) her. Es wird empfohlen, diesen sqlcl-spezifischen Befehl einzugeben, bevor andere Befehle oder Abfragen ausgeführt werden, in denen Daten angezeigt werden.

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
..

Um zu wissen, worauf sich der tablesAlias ​​bezieht, können Sie einfach verwendenalias list <alias>

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

 select table_name "TABLES" from user_tables

Sie müssen diesen Alias ​​nicht definieren, da er standardmäßig unter SQLcl verfügbar ist. Wenn Sie Tabellen aus einem bestimmten Schema auflisten möchten, einen neuen benutzerdefinierten Alias ​​verwenden und den Schemanamen als Bindungsargument übergeben möchten, wobei nur eine Reihe von Spalten angezeigt wird, können Sie dies verwenden

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

Danach können Sie einfach den Schemanamen als Argument übergeben

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
..
..

Ein komplexerer vordefinierter Alias ​​ist bekannt als Tables2, der mehrere andere Spalten anzeigt.

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

Geben Sie ein, um zu erfahren, welche Abfrage im Hintergrund ausgeführt wird

alias list tables2

Dies zeigt Ihnen eine etwas komplexere Abfrage zusammen mit vordefinierten columnDefinitionen, die üblicherweise in SQL * Plus verwendet werden.

Jeff Smith erklärt mehr über Aliase hier

Kaushik Nayak
quelle
1

Ich wollte eine Liste aller Spaltennamen erhalten, die zu einer Tabelle eines Schemas gehören, sortiert nach der Reihenfolge der Spalten-ID.

Hier ist die Abfrage, die ich verwende: -

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

In der Tat ist es möglich, die Liste der Tabellen über SQL-Abfragen abzurufen. Dies ist auch über Tools möglich, mit denen Datenwörterbücher wie ERWIN , Toad Data Modeler oder ERBuilder erstellt werden können . Mit diesen Tools verfügen Sie neben Tabellennamen über Felder, deren Typen und Objekte wie (Trigger, Sequenzen, Domänen, Ansichten ...).

Führen Sie die folgenden Schritte aus, um Ihre Tabellendefinition zu generieren:

  1. Sie müssen Ihre Datenbank zurückentwickeln
    • Im Toad Data Modeler: Menü -> Datei -> Reverse Engineering -> Reverse Engineering-Assistent
    • Im ERBuilder-Datenmodellierer: Menü -> Datei -> Reverse Engineering

Ihre Datenbank wird in der Software als Entity Relationship-Diagramm angezeigt.

  1. Generieren Sie Ihr Datenwörterbuch, das Ihre Tabellendefinition enthält
    • Im Toad-Datenmodellierer: Menü -> Modell -> Bericht erstellen -> Ausführen
    • Im ERBuilder-Datenmodellierer: Menü -> Werkzeug -> Modelldokumentation generieren
parash
quelle
0
select * from all_all_tables

Dieses zusätzliche "Alle" am Anfang gibt zusätzliche 3 Spalten, die sind:

OBJECT_ID_TYPE
TABLE_TYPE_OWNER
TABLE_TYPE
Komm damit klar
quelle
Gleich wie diese Antwort , nein?
Mustaccio