获取 Oracle 中所有表的列表?

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

答案

SELECT owner, table_name
  FROM dba_tables

假设您有权访问DBA_TABLES数据字典视图。如果您没有那些特权但需要它们,则可以请求 DBA 显式授予您对该表的特权,或者,DBA 授予您SELECT ANY DICTIONARY特权或SELECT_CATALOG_ROLE角色(这两种类型都可以让您查询任何数据字典表)。当然,您可能希望排除某些架构,例如SYSSYSTEM ,它们具有大量您可能不在乎的 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列 - 根据定义,所有者是您。

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

查询user_tablesdba_tables无效。
这个做了:

select table_name from all_tables

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

例如:

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

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

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

为了更好地使用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;

结果

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

结果

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

SELECT table_name FROM user_tables;
select object_name from user_objects where object_type='TABLE';

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

select * from tab;

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

select table_name from user_tables;

尝试以下数据字典视图。

tabs
dba_tables
all_tables
user_tables

尝试从user_tables中选择,该列表列出了当前用户拥有的表。

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

SELECT owner, table_name FROM dba_tables;

SELECT owner, 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

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

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