题 获取Oracle中所有表的列表?


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


940
2017-10-15 17:54


起源


是否 SHOW TABLES (在MySQL中完成)工作? - Martin Thoma
@MartinThoma nope。在诉诸Google之前先尝试过 - Kidburla


答案:


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 列 - 根据定义,所有者就是您。

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


1191
2017-10-15 17:56



我收到异常“ORA-00942:表或视图不存在” - vitule
然后,您没有被允许查看数据库中的所有表。您可以查询ALL_TABLES数据字典视图以查看允许访问的所有表,这些表可能是数据库中表的一小部分。 - Justin Cave
all_tables与user_tables有何不同?与标签/字典和猫的交易是什么? (我想删除一些答案,如果你扩展这些点就可以了) - Sam Saffron
@Sam Saffron - 在这两点上添加了一些额外的信息。 - Justin Cave


查询 user_tables 和 dba_tables 没用。
这个做了:

select table_name from all_tables  

158
2017-10-15 18:12



有关更完整的答案,请参阅接受的答案 包含 评论。 - vitule
尝试 user_table 而不是 user_tables。 - Limited Atonement
@LimitedAtonement对不起,这是完全错误的。该视图称为user_tables,而不是user_table。如果user_tables不适用于vitule,则还有其他问题。 - Frank Schmitt


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

例如:

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

查找名称以EST开头的所有表和名称中包含CALLREF的列。

在计算要加入的列时,这可能会有所帮助,例如,取决于您的表和列命名约定。


57
2017-09-04 07:34



我做到了 select * from cols 并返回0行。 - Gabe


为了更好地观看 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;

结果

这应该产生看起来相当可接受的东西,如:

result


39
2017-07-17 16:20



感谢“更好的观看”建议,但不是你覆盖 pagesize 30 同 pagesize 1000? - r1verside


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

  SELECT table_name FROM user_tables;

19
2017-12-21 16:32





    select object_name from user_objects where object_type='TABLE';

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

    select * from tab;

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

    select table_name from user_tables;

15
2017-10-08 09:28





尝试以下数据字典视图。

tabs
dba_tables
all_tables
user_tables

14
2018-04-25 17:30



接受的答案有什么问题? - LPL
接受的答案没有任何错误,但在这个评论中我列出了我可以用来获取数据库中的表的所有数据字典视图 - Mahmoud Ahmed El-Sayed
但是你的'答案'中没有任何新的东西,我认为这就是你立即被投票的原因(不是来自我)。 - LPL
这种反应增加了简洁性! - Victor Grazi


尝试选择 USER_TABLES 列出了当前用户拥有的表。


8
2017-10-15 18:08





有了这些,你可以选择:

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
2018-03-07 18:11



是的,但可能有数百种其他方式来获取这些信息。如果没有优势,就不应该在这里列出。这个问题已经充满了过多的信息,只会让寻求帮助的人感到困惑。 - Jon Heller
这就像数学语言。 - Van Gogh
我不同意@JonHeller,应该注意所有选项,最好的选项会得到最多的赞成。 - mulquin
@mulquin这个简单的问题已经有29个(!)的答案了。幸运的是,大多数都被删除了,并不是每个人都可以看到它们。除了接受的答案之外,不需要任何其他内容。 99.9%的时间,如果有人想要“所有表的列表”,接受的答案是要走的路。剩下的就变成了代码高尔夫。即便是这些评论也只会让用户分散注意力。 - Jon Heller
@JonHeller同意没有必要,但为什么要限制可以完成相同任务的方法数量?接受的答案已经是最突出的,就像你说的那样,99.9%的人会使用这个解决方案。如果0.01%的用户分心,这真的很麻烦吗? - mulquin