Obter lista de todas as tabelas no Oracle?

1102

Como faço para consultar um banco de dados Oracle para exibir os nomes de todas as tabelas nele?

vitule
fonte
1
Faz SHOW TABLES(como feito no MySQL) trabalho?
Martin Thoma
1
@MartinThoma nope. tentei isso primeiro, antes de recorrer ao Google #
Adam Burley

Respostas:

1364
SELECT owner, table_name
  FROM dba_tables

Isso pressupõe que você tenha acesso à DBA_TABLESvisualização do dicionário de dados. Se você não tiver esses privilégios, mas precisar deles, poderá solicitar que o DBA conceda explicitamente privilégios nessa tabela ou que o DBA conceda a você o SELECT ANY DICTIONARYprivilégio ou a SELECT_CATALOG_ROLEfunção (um dos quais permitiria consultar qualquer tabela do dicionário de dados ) Obviamente, você pode excluir determinados esquemas como SYSe SYSTEMque possuem um grande número de tabelas Oracle com as quais você provavelmente não se importa.

Como alternativa, se você não tiver acesso DBA_TABLES, poderá ver todas as tabelas às quais sua conta tem acesso através da ALL_TABLESvisualização:

SELECT owner, table_name
  FROM all_tables

Embora isso possa ser um subconjunto das tabelas disponíveis no banco de dados (ALL_TABLES mostra as informações de todas as tabelas às quais o usuário recebeu acesso).

Se você está preocupado apenas com as tabelas que você possui, não com as quais você tem acesso, você pode usar USER_TABLES:

SELECT table_name
  FROM user_tables

Como USER_TABLESapenas possui informações sobre as tabelas que você possui, ela não possui uma OWNERcoluna - o proprietário, por definição, é você.

A Oracle também tem uma série de dados legados dicionário views-- TAB, DICT, TABS, e CATpara example-- que poderia ser usado. Em geral, eu não sugeriria o uso dessas visualizações herdadas, a menos que você precise absolutamente transportar seus scripts para o Oracle 6. O Oracle não alterou essas visualizações por um longo tempo; portanto, eles geralmente têm problemas com os tipos mais novos de objetos. Por exemplo, as visualizações TABe CATmostram informações sobre as tabelas que estão na lixeira do usuário, enquanto as [DBA|ALL|USER]_TABLESvisualizações filtram essas. CATtambém mostra informações sobre logs de exibição materializada com um TABLE_TYPEde "TABLE", que é improvável que seja o que você realmente deseja. DICTcombina tabelas e sinônimos e não informa quem é o proprietário do objeto.

Justin Cave
fonte
9
Estou recebendo uma exceção "ORA-00942: tabela ou exibição não existe"
vitule 15/10/2008
46
Então você não recebeu permissão para ver todas as tabelas no banco de dados. Você pode consultar a visualização do dicionário de dados ALL_TABLES para ver todas as tabelas que você tem permissão para acessar, que pode ser um pequeno subconjunto das tabelas no banco de dados.
Justin Cave
Erro simples, se não um usuário comum do sqlplus: adicione o ponto-e-vírgula final (';') se você simplesmente não obtiver resultados com os comandos acima :).
Gimhani
Apenas observe que, no Oracle 12c, há uma coluna no dicionário de dados dba_users para ajudar a remover as tabelas de sistema do seu conjunto de resultados. A consulta completa seria SELECT owner, nome_da_tabela de dba_tables em que o proprietário não está (selecione o nome de usuário de dba_users em que oracle_maintained = 'Y')
saritonin
181

Consultando user_tablese dba_tablesnão funcionou.
Este fez:

select table_name from all_tables  
vitule
fonte
14
@LimitedAtonement Desculpe, isso está errado. A visualização é chamada de user_tables, não user_table. Se user_tables não funcionasse para o vitule, outra coisa estava errada.
26513 Frank Schmitt
67

Indo um passo adiante, há outra visualização chamada cols (all_tab_columns) que pode ser usada para verificar quais tabelas contêm um nome de coluna específico.

Por exemplo:

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

para encontrar todas as tabelas com um nome começando com EST e colunas contendo CALLREF em qualquer lugar em seus nomes.

Isso pode ajudar ao determinar em quais colunas você deseja ingressar, por exemplo, dependendo das convenções de nomenclatura de tabelas e colunas.

stealth_angoid
fonte
4
Eu fiz select * from colse obtive 0 linhas retornadas.
Gabe
50

Para uma melhor visualização com sqlplus

Se você estiver usando, primeiro sqlplusvocê pode configurar alguns parâmetros para uma visualização melhor, se suas colunas estiverem sendo mutiladas (essas variáveis ​​não devem persistir depois que você sai da sqlplussessão):

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

Mostrar todas as tabelas

Você pode usar algo assim para ver todos os nomes de tabela:

SELECT table_name, owner, tablespace_name FROM all_tables;

Mostrar tabelas que você possui

Como o @Justin Cave menciona, você pode usar isso para mostrar apenas as tabelas que você possui:

SELECT table_name FROM user_tables;

Não se esqueça das visualizações

Lembre-se de que algumas "tabelas" podem realmente ser "visualizações", para que você também possa tentar executar algo como:

SELECT view_name FROM all_views;

Os resultados

Isso deve render algo que parece bastante aceitável como:

resultado

cwd
fonte
8
obrigado pelo conselho "melhor visualização", mas não se você overwritting pagesize 30com pagesize 1000?
Pablo Recalde
22

Consulta simples para selecionar as tabelas para o usuário atual:

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

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

    select * from tab;

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

    select table_name from user_tables;
Harshil
fonte
15

Experimente as visualizações do dicionário de dados abaixo.

tabs
dba_tables
all_tables
user_tables
Mahmoud Ahmed El-Sayed
fonte
9

Tente selecionar entre user_tables, que lista as tabelas pertencentes ao usuário atual.

Eddie Awad
fonte
8

Com qualquer um desses, você pode selecionar:

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

fornece todas as tabelas de todos os usuários apenas se o usuário com o qual você efetuou login tiver sysdbaprivilégios.

praveen2609
fonte
4
Na verdade, isso não está correto. SYSDBA não é necessário. Você pode acessar DBA_TABLES de várias maneiras. 1.) Concessão direta no objeto ao usuário pelo SYS. 2.) Concessão do privilégio SELECT QUALQUER DICIONÁRIO ao usuário. 3.) Concessão da função SELECT_CATALOG_ROLE.
precisa
4

Não encontrei resposta que apontaria para usar

DBA_ALL_TABLES (ALL_ALL_TABLES/USER_ALL_TABLES)

então decidi adicionar minha versão também. Na verdade, essa exibição retorna mais que DBA_TABLES, pois também retorna tabelas de objetos ( http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_1003.htm ).

Oxidado
fonte
4

Você pode usar o Oracle Data Dictionary para obter informações sobre objetos oracle.

Você pode obter uma lista de tabelas de diferentes maneiras:

select * 
from dba_tables

ou por exemplo:

select * 
from dba_objects 
where object_type = 'TABLE' 

Em seguida, você pode obter colunas da tabela usando o nome da tabela:

select * 
from dba_tab_columns

Então você pode obter uma lista de dependências (gatilhos, visualizações e etc.):

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

Então você pode obter a fonte de texto desses objetos:

select * from dba_source

E você pode usar USERou ALLexibir em vez de, DBAse quiser.

Slava Babin
fonte
4

Incluindo visualizações:

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

Podemos obter todas as tabelas, incluindo detalhes da coluna, abaixo da consulta:

SELECT * FROM user_tab_columns;
aim_thebest
fonte
4

Abaixo está um trecho comentado de consultas SQL que descreve como as opções que você pode usar:

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

A consulta a seguir lista apenas os dados necessários, enquanto as outras respostas me deram os dados extras que apenas me confundiram.

select table_name from user_tables;
Mateen
fonte
2

Um novo recurso disponível no SQLcl (que é uma interface de linha de comando gratuita para o Oracle Database) é

Tables alias.

Aqui estão alguns exemplos mostrando o uso e aspectos adicionais do recurso. Primeiro, conecte-se a uma sessão de sqllinha de comando ( sql.exeno Windows). É recomendável inserir este comando específico do sqlcl antes de executar outros comandos ou consultas que exibam dados.

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

Para saber a que o tablesalias está se referindo, você pode simplesmente usaralias list <alias>

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

 select table_name "TABLES" from user_tables

Você não precisa definir esse alias, pois vem por padrão em SQLcl. Se você deseja listar tabelas de um esquema específico, usando um novo alias definido pelo usuário e passando o nome do esquema como um argumento de ligação, com apenas um conjunto de colunas sendo exibidas, faça isso usando

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

Depois disso, você pode simplesmente passar o nome do esquema como argumento

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

Um alias predefinido mais sofisticado é conhecido como Tables2, que exibe várias outras colunas.

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

Para saber qual consulta é executada em segundo plano, insira

alias list tables2

Isso mostrará uma consulta um pouco mais complexa, juntamente com predefinições column definições comumente usadas no SQL * Plus.

Jeff Smith explica mais sobre aliases aqui

Kaushik Nayak
fonte
1

Eu estava procurando obter uma lista de todos os nomes de colunas pertencentes a uma tabela de um esquema, classificados pela ordem do ID da coluna.

Aqui está a consulta que estou usando: -

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

De fato, é possível ter a lista de tabelas via consultas SQL. É possível fazer isso também através de ferramentas que permitem a geração de dicionários de dados, como ERWIN , Toad Data Modeler ou ERBuilder . Com essas ferramentas, além dos nomes das tabelas, você terá campos, seus tipos, objetos como (gatilhos, sequências, domínio, visualizações ...)

Abaixo as etapas a seguir para gerar sua definição de tabelas:

  1. Você precisa fazer engenharia reversa no seu banco de dados
    • No modelador de dados Toad: Menu -> Arquivo -> engenharia reversa -> assistente de engenharia reversa
    • No modelador de dados ERBuilder: Menu -> Arquivo -> engenharia reversa

Seu banco de dados será exibido no software como um diagrama de Entity Relationship.

  1. Gere seu dicionário de dados que conterá sua definição de tabelas
    • No modelador de dados do Toad: Menu -> Modelo -> Gerar relatório -> Executar
    • No modelador de dados ERBuilder: Menu -> Ferramenta -> gerar documentação do modelo
parash
fonte
0
select * from all_all_tables

este 'all' adicional no início fornece 3 colunas extras, que são:

OBJECT_ID_TYPE
TABLE_TYPE_OWNER
TABLE_TYPE
lide com isso
fonte
Mesmo que esta resposta , não?
mustaccio