如何在Oracle SQL中列出一个模式中的所有表?

185

如何在Oracle SQL中列出模式中的所有表?

14个回答

253
要查看另一个模式中的所有表格,你需要具备以下一个或多个系统特权:

SELECT ANY DICTIONARY
(SELECT | INSERT | UPDATE | DELETE) ANY TABLE

或者大锤,DBA角色。

使用任何一种,您都可以选择:

SELECT DISTINCT OWNER, OBJECT_NAME 
  FROM DBA_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
   AND OWNER = '[some other schema]'

如果没有系统权限,您只能查看您已被授予某种级别访问权限的表格,无论是直接授予还是通过角色授予。

SELECT DISTINCT OWNER, OBJECT_NAME 
  FROM ALL_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
   AND OWNER = '[some other schema]'

最后,您始终可以查询数据字典以获取自己的表信息,因为您对自己的表拥有不可撤销的权利(截至10g版本):

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'

2
除了使用%_TABLES而是使用%_OBJECTS之外,这是最完整的答案。 - APC
我记得在9i中,视图会列在%_TABLES中--因此,例如尝试自动清空模式将导致像DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS这样的语句抛出错误。所以你要么必须使用MINUS / NOT IN / NOT EXISTS删除视图,要么使用%_OBJECTS。此外,使用%_OBJECTS还留下了令人心动的提示,表明可能还有其他内容! - Adam Musch
1
查询中绝对不需要使用DISTINCT。在ALL_OBJECTS中,owner, object_name是唯一的。 - user330315
3
这些查询确实不需要去重,但是在dba_objects中,“owner,object_name”并不是唯一的;包体和包都出现在该视图中,而表和索引则位于不同的命名空间中。 - Adam Musch
最后一个查询在XE 11.2中不起作用。似乎'user_objects'中没有'owner'列。 - Rafael Chaves

84
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';

2
只有在 YOURSCHEMA 中运行或由 Adam Musch 提到的具有特权的用户运行时,此命令才会显示 YOURSCHEMA 中的 所有 表。否则,它只会显示我们已被授予权限的 YOURSCHEMA 中的表。 - APC

16

您可以查询USER_TABLES

select TABLE_NAME from user_tables

5
这是您模式中的所有表,而不是一个模式中的所有表。此外, *_TABLES数据字典视图(DBA_TABLES、ALL_TABLES、USER_TABLES)包括视图。 - Adam Musch
将“include views”替换为“在同一版本的Oracle中可以包含视图”。 - Adam Musch
@Adam Musch 在使用 Oracle 10g R2 进行测试时,它没有返回视图。 - Sathyajith Bhat

6
如果您知道所有者的名称,可以直接运行第二个查询。
--首先,您可以选择存在的所有所有者:
SELECT DISTINCT(owner) from SYS.ALL_TABLES;

--然后你可以看到该所有者下的表:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');

4

如果您以普通用户登录而没有DBA权限,则可以使用以下命令查看您自己模式的所有表和视图。

select * from tab;

3
select * from cat;

该命令将显示您模式中所有表的cat同义词用户目录的信息。


2
select * from user_tables;

(显示所有表格)


2

请试一下,将“?”替换为您的模式名称

select TABLE_NAME from  INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA =?
  AND TABLE_TYPE = 'BASE TABLE'

3
这种方法更具数据库通用性,因此我认为这种解决方案比其他所有替代方案都更好。我认为 INFORMATION_SCHEMA 在我看到的几乎所有主要数据库上都可以工作。虽然一些数据库在提取信息方面存在差异,但至少它是一个一致的查找位置。然而,从快速的互联网搜索结果来看,似乎 Oracle 几乎是唯一不支持 Information_Schema 的数据库,尽管它是 SQL-92 标准的一部分。 - Kibbee

2
如果您正在使用JDBC(Java)访问Oracle,可以使用DatabaseMetadata类。如果您正在使用ADO.NET访问Oracle,则可以采用类似的方法。
如果您正在使用ODBC访问Oracle,则可以使用SQLTables函数。
否则,如果您只需要在SQLPlus或类似的Oracle客户端中获取信息,则已经提到的查询之一就可以了。例如:
select TABLE_NAME from user_tables

2
select TABLE_NAME from user_tables;

上述查询将为您提供该用户中所有表的名称;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接