Ottieni l'elenco di tutte le tabelle in Oracle?


1102

Come si esegue una query su un database Oracle per visualizzare i nomi di tutte le tabelle in esso?


1
Fa SHOW TABLES(come fatto in MySQL) lavoro?
Martin Thoma,

1
@MartinThoma no. provato prima, prima di ricorrere a Google
Adam Burley,

Risposte:


1364
SELECT owner, table_name
  FROM dba_tables

Ciò presuppone che tu abbia accesso alla DBA_TABLESvista del dizionario dei dati. Se non disponi di tali privilegi ma ne hai bisogno, puoi richiedere che il DBA ti conceda esplicitamente i privilegi su quella tabella o che il DBA ti conceda il SELECT ANY DICTIONARYprivilegio o il SELECT_CATALOG_ROLEruolo (uno dei quali ti consentirebbe di interrogare qualsiasi tabella del dizionario dati ). Naturalmente, potresti voler escludere alcuni schemi simili SYSe SYSTEMche hanno un gran numero di tabelle Oracle che probabilmente non ti interessano.

In alternativa, se non hai accesso DBA_TABLES, puoi visualizzare tutte le tabelle a cui il tuo account ha accesso tramite la ALL_TABLESvista:

SELECT owner, table_name
  FROM all_tables

Tuttavia, potrebbe trattarsi di un sottoinsieme delle tabelle disponibili nel database (ALL_TABLES mostra le informazioni per tutte le tabelle a cui è stato concesso l'accesso all'utente).

Se ti preoccupi solo delle tabelle che possiedi, non di quelle a cui hai accesso, puoi utilizzare USER_TABLES:

SELECT table_name
  FROM user_tables

Dato USER_TABLESche contiene solo informazioni sulle tabelle che possiedi, non ha una OWNERcolonna: il proprietario, per definizione, sei tu.

Oracle ha anche una serie di dati legacy dizionario views-- TAB, DICT, TABS, e CATper example-- che potrebbe essere utilizzato. In generale, non suggerirei di utilizzare queste viste legacy a meno che non sia assolutamente necessario eseguire il backport degli script su Oracle 6. Oracle non ha modificato queste viste da molto tempo, quindi spesso hanno problemi con i nuovi tipi di oggetti. Ad esempio, le viste TABe CATmostrano entrambe le informazioni sulle tabelle che si trovano nel cestino dell'utente mentre le [DBA|ALL|USER]_TABLESviste tutte le filtrano. CATmostra anche informazioni sui registri di visualizzazione materializzati con una TABLE_TYPE"TABELLA" che è improbabile che sia ciò che desideri veramente. DICTcombina tabelle e sinonimi e non ti dice chi possiede l'oggetto.


9
Ricevo un'eccezione "ORA-00942: la tabella o la vista non esiste"
vitule,

46
Quindi non ti è stato dato il permesso di vedere tutte le tabelle nel database. È possibile eseguire una query sulla vista del dizionario dei dati ALL_TABLES per vedere tutte le tabelle a cui è consentito accedere, che può essere un piccolo sottoinsieme delle tabelle nel database.
Grotta di Giustino,

Semplice errore se non un utente sqlplus quotidiano: aggiungi il punto e virgola (';') se non ottieni risultati con i comandi sopra :).
Gimhani,

Solo una nota che a partire da Oracle 12c, c'è una colonna nel dizionario dei dati dba_users per aiutare a rimuovere le tabelle di sistema dal set di risultati. La query completa sarebbe SELEZIONA proprietario, nome_tabella da dba_tables in cui il proprietario non si trova (seleziona il nome utente da dba_users dove oracle_maintained = 'Y')
saritonin

181

Interrogazione user_tablese dba_tablesnon ha funzionato.
Questo ha fatto:

select table_name from all_tables  

14
@LimitedAtonement Siamo spiacenti, è assolutamente sbagliato. La vista si chiama user_tables, non user_table. Se user_tables non ha funzionato per vitule, qualcos'altro era sbagliato.
Frank Schmitt,

67

Andando oltre, c'è un'altra vista chiamata cols (all_tab_columns) che può essere usata per accertare quali tabelle contengono un determinato nome di colonna.

Per esempio:

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

per trovare tutte le tabelle che hanno un nome che inizia con EST e colonne che contengono CALLREF ovunque nei loro nomi.

Ciò può essere utile quando si elaborano le colonne su cui si desidera unirsi, ad esempio, a seconda delle convenzioni di denominazione delle tabelle e delle colonne.


4
Ho fatto select * from colse ho restituito 0 righe.
Gabe,

50

Per una migliore visualizzazione con sqlplus

Se stai usando sqlpluspotresti voler prima impostare alcuni parametri per una visualizzazione migliore se le tue colonne sono alterate (queste variabili non dovrebbero persistere dopo aver chiuso la sqlplussessione):

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

Mostra tutte le tabelle

È quindi possibile utilizzare qualcosa del genere per vedere tutti i nomi delle tabelle:

SELECT table_name, owner, tablespace_name FROM all_tables;

Mostra le tabelle che possiedi

Come menziona @Justin Cave, puoi usarlo per mostrare solo le tabelle che possiedi:

SELECT table_name FROM user_tables;

Non dimenticare le viste

Tieni presente che alcune "tabelle" potrebbero in realtà essere "viste", quindi puoi anche provare a eseguire qualcosa del tipo:

SELECT view_name FROM all_views;

I risultati

Questo dovrebbe produrre qualcosa che sembra abbastanza accettabile come:

risultato


8
grazie per il "migliore visualizzazione" consiglio, ma non sei tu overwritting pagesize 30con pagesize 1000?
Pablo Recalde,

22

Query semplice per selezionare le tabelle per l'utente corrente:

  SELECT table_name FROM user_tables;

18
    select object_name from user_objects where object_type='TABLE';

----------------O------------------

    select * from tab;

----------------O------------------

    select table_name from user_tables;




8

Con uno di questi, è possibile selezionare:

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';

6
select * from dba_tables

fornisce tutte le tabelle di tutti gli utenti solo se l'utente con cui si è effettuato l'accesso dispone dei sysdbaprivilegi.


4
In realtà non è corretto. SYSDBA non è richiesto. Puoi accedere a DBA_TABLES in molti modi. 1.) Concessione diretta su oggetto all'utente da parte di SYS. 2.) Concessione del privilegio SELECT ANY DICTIONARY all'utente. 3.) Concessione del ruolo SELECT_CATALOG_ROLE.
Mark J. Bobak,


4

È possibile utilizzare Oracle Data Dictionary per ottenere informazioni sugli oggetti Oracle.

È possibile ottenere un elenco di tabelle in diversi modi:

select * 
from dba_tables

o per esempio:

select * 
from dba_objects 
where object_type = 'TABLE' 

Quindi puoi ottenere le colonne della tabella usando il nome della tabella:

select * 
from dba_tab_columns

Quindi è possibile ottenere un elenco di dipendenze (trigger, viste e così via):

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

Quindi è possibile ottenere l'origine del testo di questi oggetti:

select * from dba_source

E puoi usare USERo ALLvisualizzare invece che DBAse lo desideri.


4

Incluse viste:

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

4

Siamo in grado di ottenere tutte le tabelle inclusi i dettagli della colonna dalla query seguente:

SELECT * FROM user_tab_columns;

4

Di seguito è riportato un frammento commentato di query SQL che descrivono come utilizzare le opzioni:

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

2

La query seguente elenca solo i dati richiesti, mentre le altre risposte mi hanno dato i dati extra che mi hanno solo confuso.

select table_name from user_tables;

2

Una nuova funzionalità disponibile in SQLcl (che è un'interfaccia della riga di comando gratuita per Oracle Database) è

Tables alias.

Ecco alcuni esempi che mostrano l'utilizzo e gli aspetti aggiuntivi della funzione. Innanzitutto, connettiti a una sessione della sqlriga di comando ( sql.exein Windows). Si consiglia di immettere questo comando sqlcl specifico prima di eseguire qualsiasi altro comando o query che visualizzi i dati.

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

Per sapere a cosa tablessi riferisce l' alias, puoi semplicemente usarealias list <alias>

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

 select table_name "TABLES" from user_tables

Non è necessario definire questo alias come viene fornito per impostazione predefinita in SQLcl. Se si desidera elencare le tabelle da uno schema specifico, utilizzando un nuovo alias definito dall'utente e passare il nome dello schema come argomento di bind con solo una serie di colonne visualizzate, è possibile farlo utilizzando

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

Successivamente puoi semplicemente passare il nome dello schema come argomento

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 predefinito più sofisticato è noto come Tables2, che visualizza diverse altre colonne.

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

Per sapere quale query viene eseguita in background, immettere

alias list tables2

Questo ti mostrerà una query leggermente più complessa insieme a columndefinizioni predefinite comunemente utilizzate in SQL * Plus.

Jeff Smith spiega di più sugli alias qui


1

Stavo cercando di ottenere un elenco di tutti i nomi di colonne appartenenti a una tabella di uno schema ordinati in base all'ordine dell'ID colonna.

Ecco la domanda che sto usando: -

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

1

Infatti, è possibile avere l'elenco delle tabelle tramite SQL queries.it è possibile farlo anche tramite strumenti che consentono la generazione di dizionari di dati, come ERWIN , Toad Data Modeler o ERBuilder . Con questi strumenti, oltre ai nomi delle tabelle, avrai campi, i loro tipi, oggetti come (trigger, sequenze, dominio, viste ...)

Di seguito i passaggi da seguire per generare la definizione delle tabelle:

  1. Devi decodificare il tuo database
    • In Toad data modeler: Menu -> File -> reverse engineer -> reverse engineering wizard
    • In ERBuilder data modeler: Menu -> File -> reverse engineer

Il database verrà visualizzato nel software come un diagramma di relazione tra entità.

  1. Generare il dizionario dei dati che conterrà la definizione delle tabelle
    • In Toad data modeler: Menu -> Modello -> Genera report -> Esegui
    • In ERBuilder data modeler: Menu -> Strumento -> genera la documentazione del modello

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.