关于sql:获取Oracle中所有表的列表?

Get list of all tables in Oracle?

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


1
2
SELECT owner, TABLE_NAME
  FROM dba_tables

这是假设您可以访问DBA_TABLES数据字典视图。如果您没有这些特权,但需要它们,您可以请求DBA显式地授予您该表的特权,或者DBA授予您SELECT ANY DICTIONARY特权或SELECT_CATALOG_ROLE角色(其中任何一个都允许您查询任何数据字典表)。当然,您可能希望排除某些模式,如SYSSYSTEM,这些模式具有大量您可能不关心的Oracle表。

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

1
2
SELECT owner, TABLE_NAME
  FROM all_tables

不过,这可能是数据库中可用表的一个子集(ALL_TABLES向您显示了用户被授予访问权的所有表的信息)。

如果您只关心您拥有的表,而不是您可以访问的表,那么可以使用USER_TABLES

1
2
SELECT TABLE_NAME
  FROM user_tables

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

Oracle还有许多可以使用的遗留数据字典视图——例如,TABDICTTABSCAT。一般来说,我不建议使用这些遗留视图,除非您绝对需要将脚本重新移植到Oracle6。Oracle很长一段时间没有更改这些视图,因此它们在更新类型的对象上经常出现问题。例如,TABCAT视图都显示有关用户回收站中表的信息,而[DBA|ALL|USER]_TABLES视图则全部过滤掉这些信息。CAT还显示了有关具体化视图日志的信息,其中TABLE_TYPE为"table",这不太可能是您真正想要的。DICT组合了表和同义词,不告诉您对象的所有者。


查询USER_TABLESDBA_TABLES不起作用。这个是:

1
SELECT TABLE_NAME FROM all_tables


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

例如:

1
2
3
4
SELECT TABLE_NAME, column_name
FROM cols
WHERE TABLE_NAME LIKE 'EST%'
AND column_name LIKE '%CALLREF%';

查找名称以est开头的所有表以及名称中任何位置包含callRef的列。

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


以便更好地使用sqlplus进行查看

如果您使用的是sqlplus,那么您可能需要首先设置一些参数,以便在您的列被损坏时更好地查看(退出sqlplus会话后,这些变量不应持续存在):

1
2
3
4
SET colsep '|'
SET linesize 167
SET pagesize 30
SET pagesize 1000

显示所有表

然后,可以使用类似的方法查看所有表名:

1
SELECT TABLE_NAME, owner, tablespace_name FROM all_tables;

。显示您自己的表

正如@justin cave所提到的,您可以使用它只显示您拥有的表:

1
SELECT TABLE_NAME FROM user_tables;

号不要忘记视图

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

1
SELECT view_name FROM all_views;

号结果

这将产生一些看起来相当可接受的东西,比如:

result


为当前用户选择表的简单查询:

1
  SELECT TABLE_NAME FROM user_tables;

1
    SELECT object_name FROM user_objects WHERE object_type='TABLE';

------------或-----------

1
    SELECT * FROM tab;

------------或-----------

1
    SELECT TABLE_NAME FROM user_tables;


尝试以下数据字典视图。

1
2
3
4
tabs
dba_tables
all_tables
user_tables


存在3个数据字典

dba_表描述数据库中的所有关系表。

1
2
SELECT owner, TABLE_NAME
  FROM dba_tables

用户可访问的关系表的描述

1
2
SELECT owner, TABLE_NAME
  FROM all_tables

用户表描述当前用户拥有的关系表。此视图不显示所有者列。

1
2
SELECT TABLE_NAME
  FROM user_tables

尝试从列出当前用户拥有的表的用户表中进行选择。


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

1
2
3
4
5
SELECT owner, TABLE_NAME FROM dba_tables;

SELECT owner, TABLE_NAME FROM all_tables;

SELECT TABLE_NAME FROM user_tables;

浏览更多:http://www.plsqlininformation.com/2016/08/get-list-of-all-tables-in-oracle.html


有了这些选项,您可以选择:

1
2
3
4
5
6
7
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';


1
SELECT * FROM dba_tables

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


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

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

1
2
SELECT *
FROM dba_tables

或者例如:

1
2
3
SELECT *
FROM dba_objects
WHERE object_type = 'TABLE'

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

1
2
SELECT *
FROM dba_tab_columns

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

1
2
3
SELECT *
FROM dba_dependencies
WHERE referenced_type='TABLE' AND referenced_name=:t_name

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

1
SELECT * FROM dba_source

如果需要,可以使用USERALL视图,而不是DBA


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

1
2
3
4
5
6
7
8
-- 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;


我找不到可以用的答案

1
DBA_ALL_TABLES (ALL_ALL_TABLES/USER_ALL_TABLES)

所以决定添加我的版本。这个视图实际上返回更多的dba_表,因为它也返回对象表(http://docs.oracle.com/cd/e1882_01/server.112/e40402/statviews_1003.htm)。


包括视图:

1
2
3
4
5
SELECT owner, TABLE_NAME AS table_view
  FROM dba_tables
UNION ALL
SELECT owner, view_name AS table_view
  FROM DBA_VIEWS


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

1
SELECT * FROM user_tab_columns;


sqlcl中的一个新特性(它是一个用于Oracle数据库的免费命令行接口)是

Tables别名。

这里有几个例子说明了该特性的用法和其他方面。首先,连接到sql命令行(windows中的sql.exe)会话。建议在运行任何其他显示数据的命令或查询之前输入此特定于sqlcl的命令。

1
2
SQL> SET sqlformat ansiconsole     -- resizes the columns to the width of the
                                   -- data to save space

埃多克斯1〔6〕

1
2
3
4
5
6
7
8
9
TABLES
-----------
REGIONS
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
..

为了知道Tables别名指的是什么,您可以简单地使用alias list

1
2
3
4
5
SQL> alias list TABLES
TABLES - TABLES <schema> - SHOW TABLES FROM schema
--------------------------------------------------

 SELECT TABLE_NAME"TABLES" FROM user_tables

您不必定义这个别名,因为它在sqlcl下是默认的。如果要使用新的用户定义别名列出特定架构中的表,并将架构名称作为绑定参数传递,并且只显示一组列,则可以使用

埃多克斯1〔9〕

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

埃多克斯1〔10〕

1
2
3
4
5
6
7
8
9
10
11
12
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,它显示了其他几个列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

要了解它在后台运行的查询,请输入

1
alias list tables2

这将向您展示一个稍微复杂一些的查询,以及SQL*PLUS中常用的预定义column定义。

Jeff Smith在这里解释了更多别名


我正在寻找一个所有列名称的列表,这些列名称属于按列ID顺序排序的架构表。

以下是我使用的查询:

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


下面的查询只列出了所需的数据,而其他的回答给了我额外的数据,这只会让我困惑。

1
SELECT TABLE_NAME FROM user_tables;