¿Obtener una lista de todas las tablas en Oracle?

1102

¿Cómo consulto una base de datos Oracle para mostrar los nombres de todas las tablas que contiene?

vitule
fuente
1
¿Funciona SHOW TABLES(como se hace en MySQL)?
Martin Thoma
1
@MartinThoma no. probé eso primero, antes de recurrir a Google
Adam Burley

Respuestas:

1364
SELECT owner, table_name
  FROM dba_tables

Esto supone que tiene acceso a la DBA_TABLESvista del diccionario de datos. Si no tiene esos privilegios pero los necesita, puede solicitar que el DBA le otorgue explícitamente privilegios en esa tabla, o que el DBA le otorgue el SELECT ANY DICTIONARYprivilegio o el SELECT_CATALOG_ROLErol (cualquiera de los cuales le permitiría consultar cualquier tabla de diccionario de datos) ) Por supuesto, es posible que desee excluir ciertos esquemas como SYSy SYSTEMque tienen un gran número de tablas Oracle que probablemente no le interesen.

Alternativamente, si no tiene acceso DBA_TABLES, puede ver todas las tablas a las que su cuenta tiene acceso a través de la ALL_TABLESvista:

SELECT owner, table_name
  FROM all_tables

Sin embargo, puede ser un subconjunto de las tablas disponibles en la base de datos (le ALL_TABLESmuestra la información de todas las tablas a las que se le ha otorgado acceso a su usuario).

Si solo le preocupan las tablas que posee, no aquellas a las que tiene acceso, puede usar USER_TABLES:

SELECT table_name
  FROM user_tables

Como USER_TABLESsolo tiene información sobre las tablas que posee, no tiene una OWNERcolumna: el propietario, por definición, es usted.

Oracle también tiene una serie de datos heredados diccionario views-- TAB, DICT, TABS, y CATpor ejemplo- que podrían ser utilizados. En general, no sugeriría usar estas vistas heredadas a menos que sea absolutamente necesario que envíe sus scripts a Oracle 6. Oracle no ha cambiado estas vistas en mucho tiempo, por lo que a menudo tienen problemas con los tipos de objetos más nuevos. Por ejemplo, las vistas TABy CATmuestran información sobre las tablas que están en la papelera de reciclaje del usuario, mientras que las [DBA|ALL|USER]_TABLESvistas las filtran. CATtambién muestra información sobre registros de vista materializados con una TABLE_TYPE"TABLA" que es poco probable que sea lo que realmente desea. DICTcombina tablas y sinónimos y no le dice quién posee el objeto.

Justin Cave
fuente
99
Recibo una excepción "ORA-00942: la tabla o la vista no existe"
vitule
46
Entonces no se le ha dado permiso para ver todas las tablas en la base de datos. Puede consultar la vista del diccionario de datos ALL_TABLES para ver todas las tablas a las que puede acceder, que puede ser un pequeño subconjunto de las tablas en la base de datos.
Justin Cave
Error simple si no es un usuario de sqlplus cotidiano: agregue el punto y coma final (';') si simplemente no obtiene resultados con los comandos anteriores :).
Gimhani
Solo una nota de que a partir de Oracle 12c, hay una columna en el diccionario de datos dba_users para ayudar a eliminar las tablas del sistema de su conjunto de resultados. La consulta completa sería SELECCIONAR propietario, nombre_tabla de dba_tables donde el propietario no está en (seleccione el nombre de usuario de dba_users donde oracle_maintained = 'Y')
saritonin
181

Consultando user_tablesy dba_tablesno funcionó.
Este hizo:

select table_name from all_tables  
vitule
fuente
14
@LimitedAtonement Lo siento, eso es simplemente incorrecto. La vista se llama user_tables, no user_table. Si user_tables no funcionaba para vitule, algo estaba mal.
Frank Schmitt
67

Yendo un paso más allá, hay otra vista llamada cols (all_tab_columns) que se puede usar para determinar qué tablas contienen un nombre de columna dado.

Por ejemplo:

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

para buscar todas las tablas que tengan un nombre que comience con EST y columnas que contengan CALLREF en cualquier parte de sus nombres.

Esto puede ayudar a determinar en qué columnas desea unirse, por ejemplo, según sus convenciones de nombres de tabla y columna.

stealth_angoid
fuente
44
Lo hice select * from colsy obtuve 0 filas devueltas.
Gabe
50

Para una mejor visualización con sqlplus

Si está utilizando, sqlpluses posible que primero desee configurar algunos parámetros para una mejor visualización si sus columnas se están destrozando (estas variables no deberían persistir después de salir de su sqlplussesión):

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

Mostrar todas las tablas

Luego puede usar algo como esto para ver todos los nombres de tabla:

SELECT table_name, owner, tablespace_name FROM all_tables;

Mostrar las tablas que posee

Como menciona @Justin Cave, puede usar esto para mostrar solo las tablas que posee:

SELECT table_name FROM user_tables;

No te olvides de las vistas

Tenga en cuenta que algunas "tablas" en realidad pueden ser "vistas", por lo que también puede intentar ejecutar algo como:

SELECT view_name FROM all_views;

Los resultados

Esto debería producir algo que se ve bastante aceptable como:

resultado

cwd
fuente
8
gracias por la "mejor visualización de" consejos, pero no se le overwritting pagesize 30con pagesize 1000?
Pablo Recalde
22

Consulta simple para seleccionar las tablas para el usuario actual:

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

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

    select * from tab;

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

    select table_name from user_tables;
Harshil
fuente
15

Pruebe las siguientes vistas del diccionario de datos.

tabs
dba_tables
all_tables
user_tables
Mahmoud Ahmed El-Sayed
fuente
9

Intente seleccionar de user_tables que enumera las tablas que posee el usuario actual.

Eddie Awad
fuente
8

Con cualquiera de esos, puede seleccionar:

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

proporciona todas las tablas de todos los usuarios solo si el usuario con el que inició sesión tiene los sysdbaprivilegios.

praveen2609
fuente
44
Eso en realidad no es correcto. SYSDBA no es obligatorio. Puede obtener acceso a DBA_TABLES de muchas maneras. 1.) Concesión directa en objeto al usuario por SYS. 2.) Otorga privilegio SELECCIONE CUALQUIER DICCIONARIO al usuario. 3.) Otorgamiento del rol SELECT_CATALOG_ROLE.
Mark J. Bobak
4

Puede usar Oracle Data Dictionary para obtener información sobre los objetos .

Puede obtener una lista de tablas de diferentes maneras:

select * 
from dba_tables

o por ejemplo:

select * 
from dba_objects 
where object_type = 'TABLE' 

Entonces puede obtener columnas de la tabla usando el nombre de la tabla:

select * 
from dba_tab_columns

Luego puede obtener una lista de dependencias (disparadores, vistas, etc.):

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

Entonces puede obtener la fuente de texto de estos objetos:

select * from dba_source

Y puede usar USERo ALLvistas en lugar de DBAsi lo desea.

Slava Babin
fuente
4

Vistas incluidas:

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

Podemos obtener todas las tablas, incluidos los detalles de la columna de la consulta a continuación:

SELECT * FROM user_tab_columns;
aim_thebest
fuente
4

A continuación se muestra un fragmento comentado de consultas SQL que describe cómo puede usar las opciones:

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

La siguiente consulta solo enumera los datos requeridos, mientras que las otras respuestas me dieron los datos adicionales que solo me confundieron.

select table_name from user_tables;
Mateen
fuente
2

Una nueva característica disponible en SQLcl (que es una interfaz de línea de comandos gratuita para Oracle Database) es

Tables alias.

Aquí hay algunos ejemplos que muestran el uso y los aspectos adicionales de la función. Primero, conéctese a una sesión de sqllínea de comando ( sql.exeen Windows). Se recomienda ingresar este comando específico de sqlcl antes de ejecutar cualquier otro comando o consulta que muestre datos.

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 qué tablesse refiere el alias, simplemente puede usaralias list <alias>

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

 select table_name "TABLES" from user_tables

No tiene que definir este alias, ya que viene por defecto en SQLcl. Si desea enumerar tablas de un esquema específico, utilizando un nuevo alias definido por el usuario y pasando el nombre del esquema como argumento de enlace con solo un conjunto de columnas que se muestran, puede hacerlo utilizando

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

Posteriormente, simplemente puede pasar el nombre del 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
..
..

Un alias predefinido más sofisticado se conoce como Tables2, que muestra varias otras columnas.

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 qué consulta se ejecuta en segundo plano, ingrese

alias list tables2

Esto le mostrará una consulta un poco más compleja junto con columndefiniciones predefinidas comúnmente utilizadas en SQL * Plus.

Jeff Smith explica más sobre los alias aquí

Kaushik Nayak
fuente
1

Estaba buscando obtener una lista de todos los nombres de columnas que pertenecen a una tabla de un esquema ordenado por el orden de la identificación de la columna.

Aquí está la consulta que estoy 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
fuente
1

De hecho, es posible tener la lista de tablas a través de consultas SQL. También es posible hacerlo a través de herramientas que permiten la generación de diccionarios de datos, como ERWIN , Toad Data Modeler o ERBuilder. . Con estas herramientas, además de los nombres de las tablas, tendrá campos, sus tipos, objetos como (disparadores, secuencias, dominio, vistas ...)

A continuación los pasos a seguir para generar su definición de tablas:

  1. Tienes que aplicar ingeniería inversa a tu base de datos
    • En Toad Data Modeler: Menú -> Archivo -> ingeniería inversa -> asistente de ingeniería inversa
    • En el modelador de datos ERBuilder: Menú -> Archivo -> ingeniería inversa

Su base de datos se mostrará en el software como un diagrama de Relación de entidad.

  1. Genere su diccionario de datos que contendrá su definición de tablas
    • En Toad Data Modeler: Menú -> Modelo -> Generar informe -> Ejecutar
    • En el modelador de datos ERBuilder: Menú -> Herramienta -> generar documentación del modelo
parash
fuente
0
select * from all_all_tables

este 'todo' adicional al principio da 3 columnas adicionales que son:

OBJECT_ID_TYPE
TABLE_TYPE_OWNER
TABLE_TYPE
tratar con él
fuente
Igual que esta respuesta , ¿no?
mustaccio