如何在Oracle SQL中列出架构中的所有表?


Answers:


220

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

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
除了使用%_OBJECTS代替以外,“最完整的答案” %_TABLES
APC 2010年

我记得在9i中,视图将在%_TABLES中列出-因此,例如,尝试自动清空模式将导致DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS之类的语句抛出错误。因此,您必须使用MINUS / NOT IN / NOT EXISTS删除视图,或者再次%_OBJECTS。另外,与%_OBJECTS背道而驰,还有一个诱人的暗示,那就是那里还有什么可能!
亚当·穆奇

1
DISTINCT在查询中绝对不需要。owner, object_name是唯一的ALL_OBJECTS
a_horse_with_no_name 2013年

1
这些查询不需要区分,这是事实。但是,owner, object_name在dba_objects中无论如何都不是唯一的;包主体和包都出现在该视图中,表和索引位于不同的命名空间中。
亚当·穆奇

最后一个查询无法像XE 11.2中那样工作。看来“ user_objects”中没有“所有者”列。
拉斐尔·查韦斯

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

2
如果由YOURSCHEMA运行或由具有Adam Musch提到的特权的用户运行,则仅显示YOURSCHEMA中的所有表。否则,它仅显示我们已被授予特权的YOURSCHEMA中的表。
APC 2010年

14

您可以查询 USER_TABLES

select TABLE_NAME from user_tables

5
那就是您架构中的所有表,而不是架构中的所有表。此外,* _ TABLES数据字典视图(DBA_TABLES,ALL_TABLES,USER_TABLES)包括视图。
亚当·穆奇

将“包含视图”替换为“可以在seme版本的Oracle中包含视图”。
亚当·穆奇

@Adam Musch使用Oracle 10g R2进行了测试,它没有返回视图。
Sathyajith Bhat 2010年

4

如果以未经DBA许可的普通用户身份登录,则可以使用以下命令查看自己架构的所有表和视图。

select * from tab;

3

试试这个,替换吗?与您的架构名称

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

3
这与数据库无关,因此我认为这种解决方案比所有替代方案都更好。我认为INFORMATION_SCHEMA可以在我见过的每个主要数据库上使用。尽管可以获取的信息有所不同,但至少是一个一致的地方。但是,通过快速的Internet搜索,看来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;

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


2
select * from user_tables;

(显示所有表格)


1

SELECT table_name,所有者来自all_tables,其中owner ='schema_name'按table_name顺序


1

如果您知道所有者名称,则可以直接运行第二个查询。

-首先,您可以选择存在的所有所有者:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

-然后您可以查看该所有者下的表格:

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


0

如果还需要获取表的大小,这将很方便:

select SEGMENT_NAME, PARTITION_NAME, BYTES from user_segments where SEGMENT_TYPE='TABLE' order by 1


0

OWNER模式下所有表的表名和行计数器:

SELECT table_name, num_rows counter from DBA_TABLES WHERE owner = 'OWNER'

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.