获取Oracle中所有表的列表?


1102

如何查询Oracle数据库以显示其中所有表的名称?


1
是否SHOW TABLES工作(如在MySQL做)?
马丁·托马

1
@MartinThoma不。试过了第一,诉诸谷歌前
亚当白肋烟

Answers:


1364
SELECT owner, table_name
  FROM dba_tables

假设您有权访问DBA_TABLES数据字典视图。如果您没有这些特权但需要它们,则可以请求DBA显式授予您对该表的特权,或者请求DBA授予您该SELECT ANY DICTIONARY特权或SELECT_CATALOG_ROLE角色(这两者都可以让您查询任何数据字典表) )。当然,您可能希望排除某些模式,例如,SYS并且SYSTEM其中包含大量您可能不在乎的Oracle表。

或者,如果您无权访问DBA_TABLES,则可以通过ALL_TABLES视图查看您的帐户有权访问的所有表:

SELECT owner, table_name
  FROM all_tables

虽然,这可能是数据库中可用表的子集(ALL_TABLES向您显示已授予用户访问权限的所有表的信息)。

如果您只关心自己拥有的表,而不关心自己有权访问的表,则可以使用USER_TABLES

SELECT table_name
  FROM user_tables

由于USER_TABLES仅包含有关您拥有的表的信息,因此它没有一OWNER列–根据定义,所有者是您。

甲骨文也有一些遗留的数据字典views-- TABDICTTABS,并CAT为example--可能被使用。通常,除非绝对需要将脚本反向移植到Oracle 6,否则我建议不要使用这些旧式视图。Oracle很长时间以来都没有更改这些视图,因此它们经常遇到新类型的对象的问题。例如,TABCAT视图均显示有关用户回收站中表的信息,而[DBA|ALL|USER]_TABLES视图均将其过滤掉。 CAT还显示带有TABLE_TYPE“ TABLE”的物化视图日志的信息,这不太可能是您真正想要的。 DICT结合了表格和同义词,并且不会告诉您对象的所有者。


8
我收到异常消息“ ORA-00942:表或视图不存在”
vitule

45
这样就没有授予您查看数据库中所有表的权限。您可以查询ALL_TABLES数据字典视图以查看所有允许访问的表,这些表可能是数据库中表的一小部分。
贾斯汀·凯夫

如果不是日常的sqlplus用户,则容易犯一个简单的错误:如果您只是不使用上述命令:)则添加结尾的分号(';')。
Gimhani

请注意,从Oracle 12c开始,dba_users数据字典中有一列可帮助从结果集中删除系统表。完整查询将是SELECT所有者,dba_tables中的table_name(所有者不在)(从dba_users中选择用户名,其中oracle_maintained ='Y')
saritonin

181

查询user_tablesdba_tables没有用。
这个做了:

select table_name from all_tables  

14
@LimitedAtonement抱歉,这是完全错误的。该视图称为user_tables,而不是user_table。如果user_tables不适用于vitule,则其他问题不存在。
Frank Schmitt 2013年

67

更进一步,还有另一种视图称为cols(all_tab_columns),该视图可用于确定哪些表包含给定的列名。

例如:

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

查找名称以EST开头的所有表,以及名称中任意位置包含CALLREF的列。

例如,根据表和列的命名约定,这有助于确定要加入的列。


4
我做到了,select * from cols并返回了0行。
加布2014年

50

为了更好地观看 sqlplus

如果您使用的是列sqlplus,则可能需要首先设置一些参数以便更好地查看(退出sqlplus会话后,这些变量不应保留):

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

显示所有表格

然后,您可以使用类似以下的内容查看所有表名:

SELECT table_name, owner, tablespace_name FROM all_tables;

显示您拥有的表

正如@Justin Cave提到的那样,您可以使用它仅显示您拥有的表:

SELECT table_name FROM user_tables;

不要忘了视图

请记住,某些“表”实际上可能是“视图”,因此您也可以尝试运行以下内容:

SELECT view_name FROM all_views;

结果

这将产生看起来相当可接受的内容,例如:

结果


8
感谢“更好看”的建议,但不是你overwritting pagesize 30pagesize 1000
Pablo Recalde


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

- - - - - - - - 要么 - - - - - - - - -

    select * from tab;

- - - - - - - - 要么 - - - - - - - - -

    select table_name from user_tables;



9

Oracle数据库使用以下查询显示所有表的名称

SELECT所有者,table_name FROM dba_tables;

SELECT所有者,table_name FROM all_tables;

SELECT table_name FROM user_tables;

请访问:http ://www.plsqlinformation.com/2016/08/get-list-of-all-tables-in-oracle.html


8

使用任何这些,您可以选择:

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

仅当您登录的用户具有sysdba特权时,才提供所有用户的所有表。


4
这实际上是不正确的。不需要SYSDBA。您可以通过多种方式访问​​DBA_TABLES。1.)由SYS直接授予对象给用户。2.)向用户授予SELECT ANY DICTIONARY特权。3.)授予SELECT_CATALOG_ROLE角色。
Mark J. Bobak 2013年


4

您可以使用Oracle数据字典获取有关oracle对象的信息。

您可以通过不同的方式获取表列表:

select * 
from dba_tables

或例如:

select * 
from dba_objects 
where object_type = 'TABLE' 

然后,您可以使用表名称获取表列:

select * 
from dba_tab_columns

然后,您可以获得依赖项列表(触发器,视图等):

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

然后,您可以获取此对象的文本源:

select * from dba_source

而且您可以使用USERALL视图,而不是DBA如果需要的话。


4

包括视图:

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

4

我们可以从以下查询中获取所有表,包括列详细信息:

SELECT * FROM user_tab_columns;

4

下面是一段带注释的SQL查询片段,描述了如何使用选项:

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

以下查询仅列出了所需的数据,而其他答案给了我额外的数据,这些数据只会让我感到困惑。

select table_name from user_tables;

2

SQLcl(这是Oracle数据库的免费命令行界面)中提供的一项新功能是

Tables 别名。

以下是一些示例,显示了此功能的用法和其他方面。首先,连接到sql命令行(sql.exe在Windows中)会话。建议在运行任何其他显示数据的命令或查询之前输入此sqlcl特定命令。

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

要知道tables别名是指什么,您可以简单地使用alias list <alias>

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

 select table_name "TABLES" from user_tables

您不必定义此别名,因为默认情况下,该别名在SQLcl中出现。如果要从特定架构中列出表,请使用新的用户定义的别名并将架构名称作为绑定参数传递,并且只显示一组列,则可以使用

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

之后,您可以简单地将模式名称作为参数传递

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

更为复杂的预定义别名称为Tables2,它显示其他几列。

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

要知道它在后台运行什么查询,请输入

alias list tables2

这将向您显示一个稍微复杂的查询以及columnSQL * Plus中常用的预定义定义。

杰夫·史密斯(Jeff Smith)在此处详细说明了别名


1

我一直在寻找一个列表,该列表包含属于模式表的所有列名称,这些列按列ID的顺序排序。

这是我正在使用的查询:-

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

1

确实,可以通过SQL查询获得表列表,也可以通过允许生成数据字典的工具(例如ERWINToad Data ModelerERBuilder)来做到这一点。使用这些工具,除了表名之外,您还将具有字段,它们的类型,对象(触发,序列,域,视图...)

按照以下步骤生成表定义:

  1. 您必须对数据库进行反向工程
    • 在Toad数据建模器中:菜单->文件->反向工程->反向工程向导
    • 在ERBuilder数据建模器中:菜单->文件->反向工程

您的数据库将在软件中显示为“实体关系”图。

  1. 生成将包含表定义的数据字典
    • 在Toad数据建模器中:菜单->模型->生成报告->运行
    • 在ERBuilder数据建模器中:菜单->工具->生成模型文档

0
select * from all_all_tables

开头的额外“全部”提供了额外的3列,分别是:

OBJECT_ID_TYPE
TABLE_TYPE_OWNER
TABLE_TYPE

此答案相同,不是吗?
mustaccio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.