Uzyskaj listę wszystkich tabel w Oracle?

1102

Jak zapytać bazę danych Oracle, aby wyświetlić nazwy wszystkich tabel w niej zawartych?

vitule
źródło
1
Czy SHOW TABLES(jak zrobiono w MySQL) działa?
Martin Thoma,
1
@MartinThoma nope. wypróbowałem to najpierw, zanim skorzystałem z Google
Adam Burley

Odpowiedzi:

1364
SELECT owner, table_name
  FROM dba_tables

Zakłada się, że masz dostęp do DBA_TABLESwidoku słownika danych. Jeśli nie masz tych uprawnień, ale potrzebujesz ich, możesz zażądać, aby DBA jawnie przyznało ci uprawnienia do tej tabeli, lub że DBA przyznaje ci SELECT ANY DICTIONARYuprawnienia lub SELECT_CATALOG_ROLErolę (które pozwolą ci na zapytanie dowolnej tabeli słownika danych) ). Oczywiście, można wykluczyć pewnych schematów jak SYSi SYSTEMktóre mają dużą liczbę tabel Oracle, że prawdopodobnie nie obchodzi.

Alternatywnie, jeśli nie masz dostępu DBA_TABLES, możesz zobaczyć wszystkie tabele, do których twoje konto ma dostęp poprzez ALL_TABLESwidok:

SELECT owner, table_name
  FROM all_tables

Chociaż może to być podzbiór tabel dostępnych w bazie danych ( ALL_TABLESpokazuje informacje o wszystkich tabelach, do których użytkownik uzyskał dostęp).

Jeśli interesują Cię tylko tabele, które posiadasz, a nie te, do których masz dostęp, możesz użyć USER_TABLES:

SELECT table_name
  FROM user_tables

Ponieważ USER_TABLESma tylko informacje o tabelach, które posiadasz, nie ma OWNERkolumny - właścicielem z definicji jesteś ty.

Oracle ma również szereg dotychczasowych danych słownika views-- TAB, DICT, TABS, i CATdla example-- które mogłyby zostać wykorzystane. Zasadniczo nie sugerowałbym używania tych starszych widoków, chyba że absolutnie musisz przenieść swoje skrypty do Oracle 6. Oracle długo nie zmieniało tych widoków, więc często mają problemy z nowszymi typami obiektów. Na przykład oba widoki TABi CATpokazują informacje o tabelach znajdujących się w koszu użytkownika, podczas gdy [DBA|ALL|USER]_TABLESwszystkie widoki je odfiltrowują. CATpokazuje również informacje o zmaterializowanych dziennikach widoku za pomocą TABLE_TYPE„TABELI”, co prawdopodobnie nie będzie tym, czego naprawdę chcesz. DICTłączy tabele i synonimy i nie mówi, kto jest właścicielem obiektu.

Justin Cave
źródło
8
Otrzymuję wyjątek „ORA-00942: tabela lub widok nie istnieje”
vitule
45
Wtedy nie masz uprawnień, aby zobaczyć wszystkie tabele w bazie danych. Możesz przeszukać widok słownika danych ALL_TABLES, aby zobaczyć wszystkie tabele, do których masz dostęp, co może być małym podzbiorem tabel w bazie danych.
Justin Cave
Prosty błąd, jeśli nie zwykły użytkownik sqlplus: dodaj końcowy średnik (';'), jeśli po prostu nie otrzymujesz wyników z powyższymi poleceniami :).
Gimhani
Uwaga: od wersji Oracle 12c w słowniku danych dba_users znajduje się kolumna, która pomaga usunąć tabele systemowe z zestawu wyników. Pełne zapytanie brzmiałoby WYBIERZ właściciela, nazwa_tabeli z tabeli dba_tabeli właściciela nie ma w (wybierz nazwę użytkownika z dba_users gdzie oracle_maintained = 'Y')
saritonin
181

Zapytania user_tablesi dba_tablesnie działały.
Ten zrobił:

select table_name from all_tables  
vitule
źródło
14
@LimitedAtonement Przepraszamy, to po prostu źle. Widok nazywa się tabelami użytkowników, a nie tabelami użytkowników. Jeśli tabele użytkownika nie działały dla vitule, coś innego było nie tak.
Frank Schmitt
67

Idąc o krok dalej, istnieje inny widok o nazwie cols (all_tab_columns), którego można użyć do ustalenia, które tabele zawierają daną nazwę kolumny.

Na przykład:

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

aby znaleźć wszystkie tabele o nazwie zaczynającej się od EST i kolumny zawierające CALLREF w dowolnym miejscu ich nazw.

Może to pomóc w określeniu, do których kolumn chcesz dołączyć, na przykład w zależności od konwencji nazewnictwa tabel i kolumn.

stealth_angoid
źródło
4
Zrobiłem select * from colsi otrzymałem 0 wierszy.
Gabe
50

Dla lepszego oglądania dzięki sqlplus

Jeśli używasz, sqlplusmożesz najpierw ustawić kilka parametrów dla lepszego oglądania, jeśli kolumny są zniekształcone (te zmienne nie powinny się utrzymywać po zakończeniu sqlplussesji):

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

Pokaż wszystkie tabele

Następnie możesz użyć czegoś takiego, aby zobaczyć wszystkie nazwy tabel:

SELECT table_name, owner, tablespace_name FROM all_tables;

Pokaż stoły, które posiadasz

Jak wspomina @Justin Cave, możesz użyć tego, aby wyświetlić tylko stoły, które posiadasz:

SELECT table_name FROM user_tables;

Nie zapomnij o widokach

Pamiętaj, że niektóre „tabele” mogą w rzeczywistości być „widokami”, więc możesz także spróbować uruchomić coś takiego:

SELECT view_name FROM all_views;

Wyniki

Powinno to dać coś, co wygląda dość akceptowalnie, na przykład:

wynik

cwd
źródło
8
dzięki za „lepszy” oglądania radę, ale nie jest pan overwritting pagesize 30z pagesize 1000?
Pablo Recalde
22

Proste zapytanie, aby wybrać tabele dla bieżącego użytkownika:

  SELECT table_name FROM user_tables;
Israel Margulies
źródło
18
    select object_name from user_objects where object_type='TABLE';

----------------LUB------------------

    select * from tab;

----------------LUB------------------

    select table_name from user_tables;
Ostry
źródło
15

Wypróbuj poniższe widoki słownika danych.

tabs
dba_tables
all_tables
user_tables
Mahmoud Ahmed El-Sayed
źródło
9

Spróbuj wybrać z tabel_użytkowników, które zawierają tabele należące do bieżącego użytkownika.

Eddie Awad
źródło
8

Za pomocą dowolnego z nich możesz wybrać:

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
źródło
6
select * from dba_tables

daje wszystkie tabele wszystkich użytkowników tylko wtedy, gdy użytkownik, z którym się zalogowałeś, ma sysdbauprawnienia.

praveen2609
źródło
4
To właściwie nie jest poprawne. SYSDBA nie jest wymagana. Dostęp do DBA_TABLES można uzyskać na wiele sposobów. 1.) Bezpośrednie przyznanie obiektu obiektowi przez SYS. 2.) Przyznaj użytkownikowi uprawnienie WYBIERZ DOWOLNY SŁOWNIK. 3.) Przyznaj rolę SELECT_CATALOG_ROLE.
Mark J. Bobak
4

Nie znalazłem odpowiedzi, która wskazywałaby na użycie

DBA_ALL_TABLES (ALL_ALL_TABLES/USER_ALL_TABLES)

więc postanowiłem również dodać moją wersję. Ten widok faktycznie zwraca więcej niż DBA_TABLES, ponieważ zwraca również tabele obiektów ( http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_1003.htm ).

Zardzewiały
źródło
4

Możesz użyć Oracle Data Dictionary, aby uzyskać informacje o obiektach Oracle.

Możesz uzyskać listę tabel na różne sposoby:

select * 
from dba_tables

lub na przykład:

select * 
from dba_objects 
where object_type = 'TABLE' 

Następnie możesz uzyskać kolumny tabeli, używając nazwy tabeli:

select * 
from dba_tab_columns

Następnie możesz uzyskać listę zależności (wyzwalacze, widoki itp.):

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

Następnie możesz uzyskać źródło tekstu tych obiektów:

select * from dba_source

I możesz użyć USERlub ALLwidoki zamiast, DBAjeśli chcesz.

Slava Babin
źródło
4

W tym widoki:

SELECT owner, table_name as table_view
  FROM dba_tables
UNION ALL
SELECT owner, view_name as table_view
  FROM DBA_VIEWS
Punnerud
źródło
4

Możemy uzyskać wszystkie tabele, w tym szczegóły kolumn z poniższego zapytania:

SELECT * FROM user_tab_columns;
aim_thebest
źródło
4

Poniżej znajduje się skomentowany fragment zapytań SQL opisujący, w jaki sposób możesz skorzystać z opcji:

-- 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
źródło
2

Poniższe zapytanie zawiera tylko wymagane dane, podczas gdy inne odpowiedzi dały mi dodatkowe dane, które tylko mnie pomieszały.

select table_name from user_tables;
Mateen
źródło
2

Nowa funkcja dostępna w SQLcl (który jest bezpłatnym interfejsem wiersza poleceń dla Oracle Database)

Tables Alias.

Oto kilka przykładów pokazujących użycie i dodatkowe aspekty tej funkcji. Najpierw połącz się z sesją sqlwiersza poleceń ( sql.exew systemie Windows). Zaleca się wpisanie tego polecenia specyficznego dla sqlcl przed uruchomieniem jakichkolwiek innych poleceń lub zapytań wyświetlających dane.

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

Aby wiedzieć, do czego tablesodnosi się alias, możesz po prostu użyćalias list <alias>

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

 select table_name "TABLES" from user_tables

Nie musisz definiować tego aliasu, ponieważ domyślnie jest on dostępny w SQLcl. Jeśli chcesz wyświetlić tabele z określonego schematu, używając nowego aliasu zdefiniowanego przez użytkownika i przekazując nazwę schematu jako argument powiązania z wyświetlanym tylko zestawem kolumn, możesz to zrobić za pomocą

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

Następnie możesz po prostu przekazać nazwę schematu jako 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
..
..

Bardziej zaawansowany predefiniowany alias jest znany jako Tables2, który wyświetla kilka innych kolumn.

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

Aby dowiedzieć się, jakie zapytanie działa w tle, wpisz

alias list tables2

Spowoduje to wyświetlenie nieco bardziej złożonego zapytania wraz ze wstępnie zdefiniowanymi columndefinicjami powszechnie używanymi w SQL * Plus.

Jeff Smith wyjaśnia więcej na temat aliasów tutaj

Kaushik Nayak
źródło
1

Chciałem uzyskać listę wszystkich nazw kolumn należących do tabeli schematu posortowanej według kolejności id kolumny.

Oto zapytanie, którego używam: -

SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'schema_owner_username' AND TABLE_NAME='table_name'
ORDER BY COLUMN_ID ASC;
Rakesh Narang
źródło
1

Rzeczywiście, możliwe jest tworzenie listy tabel za pomocą zapytań SQL. Można to również zrobić za pomocą narzędzi, które pozwalają na generowanie słowników danych, takich jak ERWIN , Toad Data Modeler lub ERBuilder . Dzięki tym narzędziom oprócz nazw tabel będziesz mieć pola, ich typy, obiekty takie jak (wyzwalacze, sekwencje, domena, widoki ...)

Poniższe kroki do wygenerowania definicji tabel:

  1. Musisz odtworzyć bazę danych
    • W narzędziu do modelowania danych Toad: Menu -> Plik -> inżynier wsteczny -> kreator inżynierii wstecznej
    • W narzędziu do modelowania danych ERBuilder: Menu -> Plik -> inżynier wsteczny

Twoja baza danych zostanie wyświetlona w oprogramowaniu jako diagram relacji encji.

  1. Wygeneruj słownik danych, który będzie zawierał definicję tabel
    • W narzędziu do modelowania danych Toad: Menu -> Model -> Wygeneruj raport -> Uruchom
    • W narzędziu do modelowania danych ERBuilder: Menu -> Narzędzie -> wygeneruj dokumentację modelu
parash
źródło
0
select * from all_all_tables

to dodatkowe „wszystko” na początku daje dodatkowe 3 kolumny, które są:

OBJECT_ID_TYPE
TABLE_TYPE_OWNER
TABLE_TYPE
sobie z tym poradzić
źródło
Taka sama jak ta odpowiedź , nie?
mustaccio,