将 SQL 表导出为 CSV:SQL Server、MySQL、PostgreSQL 和 Oracle
2026-07-30
2026-07-30
2026-07-30
2026-07-30
MySQL 和 PostgreSQL 用户习惯于使用 SHOW TABLES; 或 \dt。在 Oracle 中,这两个命令都不存在,运行它们会报错。
Oracle 使用数据字典(Data Dictionary),这是一组只读的系统视图,存储数据库中所有内容的元数据。查询这些视图比单行快捷命令更冗长,但也功能强大得多。除了表名之外,您还可以在同一次查询中获取存储详情、分区信息、行数和上次分析日期。
| 数据库 | 如何列出表 |
|---|---|
| MySQL | SHOW TABLES; |
| PostgreSQL | \dt 或查询 information_schema |
| Oracle | 查询数据字典视图(USER_TABLES、ALL_TABLES、DBA_TABLES) |
数据字典按三个作用域级别组织,每个级别对应不同的数据库访问权限。您查询哪个视图取决于您的账户被允许查看的内容,而这正是下一节要介绍的内容。

Oracle 根据所有权和权限将其数据字典视图组织为三个级别。在编写任何查询之前,了解您的账户适用的级别是第一步。
当您只需要查看自己模式中创建的表时,请使用 USER_TABLES。这是开发人员处理自己对象时最常见的起点。
SELECT table_name, tablespace_name, num_rows, last_analyzed
FROM user_tables
ORDER BY table_name;

包含 num_rows 和 last_analyzed 可以让您快速了解表是否有数据以及优化器上次收集统计信息的时间。
在多模式环境中,您可能需要查看其他用户拥有的、您已被授予读取或修改权限的表。ALL_TABLES 涵盖您的账户可访问的所有表,而不仅仅是您自己的表。
要按特定模式筛选,请添加 WHERE 子句:
SELECT owner, table_name, tablespace_name
FROM all_tables
WHERE owner = 'SALES_DEPT'
ORDER BY owner, table_name;

一个重要细节:Oracle 默认以大写存储表名和用户名。查询 WHERE owner = 'sales_dept' 将返回零结果。请始终在单引号内使用大写,除非模式是用带引号的混合大小写名称创建的。
DBA_TABLES 为您提供跨所有模式的每个表的完整视图。您需要 DBA 角色或 SELECT ANY DICTIONARY 权限才能查询它。
由于 Oracle 附带许多内部系统模式,原始查询会返回大量噪音。使用排除列表将其过滤掉:
SELECT owner, table_name, tablespace_name
FROM dba_tables
WHERE owner NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'DBSNMP', 'APPQOSSYS')
ORDER BY owner, table_name;

如果您收到 ORA-00942:表或视图不存在,则您的账户缺少所需权限。请向 DBA 申请授予您 SELECT_CATALOG_ROLE,这是无需完整 DBA 权限即可启用对字典视图读取访问的标准方式。
标准查询可以获取基本列表。以下查询更进一步,帮助您按列、按大小或按部分名称查找表,并为工作选择合适的工具。
| 使用场景 | 查询视图 | 所需权限 |
|---|---|---|
| 按列名查找表 | ALL_TAB_COLUMNS | 标准 |
| 检查行数和上次分析日期 | USER_TABLES | 标准 |
| 按部分名称搜索表 | USER_TABLES | 标准 |
| 按大小列出表 | DBA_SEGMENTS | DBA 角色 |
| 列出排除系统模式的表 | DBA_TABLES | DBA 角色 |
| 可视化浏览 | SQL Developer / dbForge | 用户访问 |
如果您知道一个列名但不记得哪些表使用了它,请查询 ALL_TAB_COLUMNS。这在包含许多相关表的复杂模式中尤其有用。
SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE column_name = 'USER_ID'
ORDER BY owner, table_name;

Oracle 优化器依赖统计信息来选择最高效的执行计划。如果 num_rows 不准确或 last_analyzed 是几个月前的,查询性能可能会悄悄下降,而没有任何明显错误。
SELECT table_name, num_rows, last_analyzed
FROM user_tables
WHERE num_rows > 0
ORDER BY num_rows DESC;

DBMS_STATS.GATHER_TABLE_STATS。当您只记得表名的一部分时,使用 LIKE 运算符配合 % 通配符。请将搜索字符串保持为大写,以匹配 Oracle 存储标识符的方式。
SELECT table_name
FROM user_tables
WHERE table_name LIKE '%INVENTORY%';

Oracle 中的表数据存储在段中,因此您需要查询 DBA_SEGMENTS 来获取准确的大小数据。此查询返回每个表的总大小(以 MB 为单位),从大到小排列。
SELECT segment_name AS table_name,
owner,
SUM(bytes) / 1024 / 1024 AS size_mb
FROM dba_segments
WHERE segment_type = 'TABLE'
GROUP BY segment_name, owner
ORDER BY size_mb DESC;

这是进行存储审计或在迁移前识别大表的实用起点。
对 DBA_TABLES 的原始查询包含 Oracle 自己的内部表,这些通常不是您需要的。将其过滤掉以获得应用程序表的清晰视图。
SELECT owner, table_name
FROM dba_tables
WHERE owner NOT IN (
'SYS', 'SYSTEM', 'OUTLN', 'DBSNMP',
'APPQOSSYS', 'CTXSYS', 'XDB', 'WMSYS'
)
ORDER BY owner, table_name;

选择正确的工具取决于您的工作方式:
SET LINESIZE 等命令。即使是经验丰富的 DBA 在查询 Oracle 数据字典时也会遇到访问问题或意外的空结果。以下是四个最常见的问题及其修复方法。
SELECT_CATALOG_ROLE 或 SELECT ANY DICTIONARY 权限。SELECT 权限。CREATE TABLE "Sales_Data",Oracle 会保留精确的大小写。使用 'SALES_DATA' 的标准查询将返回空。SELECT * FROM "Sales_Data";ALTER SESSION SET CONTAINER = pdb_name; 切换到正确的 PDB。一旦您清楚了解了表结构,自然的下一个问题就是如何使数据保持受保护并在系统间同步。对于在生产环境中运行 Oracle 的团队来说,这意味着需要有一个可靠的复制层,能够处理高事务量、模式变更和跨平台环境,而不会中断生产运行。
i2Stream 是一款企业级数据库复制解决方案,正是为这些场景而构建的。它不是将复制视为一种通用流程,而是直接映射 Oracle 环境在实践中面临的挑战。
对于需要超越复制的更广泛数据韧性的团队,英方软件的产品套件覆盖了完整范围。i2Backup 处理跨物理、虚拟和云环境的集中备份,而 i2Move 支持 Oracle 及其他系统的非中断跨平台迁移。
问 1:我可以在没有 DBA 权限的情况下在 Oracle 中列出表吗?
可以。USER_TABLES 和 ALL_TABLES 都可以被标准用户访问,无需任何特殊权限。USER_TABLES 显示您拥有的表,ALL_TABLES 显示您被授予访问权限的所有表。只有在查询 DBA_TABLES 时才需要提升权限。
问 2:为什么 USER_TABLES 不返回结果?
这通常意味着当前用户不拥有任何表。如果您使用的是专用连接账户或新创建的用户,请尝试查询 ALL_TABLES 来查看您的账户有权访问的对象。
问 3:USER_TABLES、ALL_TABLES 和 DBA_TABLES 之间有什么区别?
USER_TABLES 仅显示您拥有的表。ALL_TABLES 包括这些加上其他用户授予您访问权限的表。DBA_TABLES 涵盖数据库中所有表,但需要管理权限才能查询。
问 4:如何在 Oracle 中按大小列出表?
查询 DBA_SEGMENTS,按 segment_type = ‘TABLE’ 过滤并按段汇总字节数。这需要 DBA 权限。完整语法请参见上文高级查询部分。
在 Oracle 中列出表归结为知道哪个数据字典视图适合您的情况。使用 USER_TABLES 查询您自己的模式,ALL_TABLES 用于查看您有权限访问的跨模式表,DBA_TABLES 用于在具备适当权限时获取完整的数据库范围视图。
在此基础上,本指南中的高级查询可帮助您更进一步:按列名查找表、检查统计信息、按大小筛选或按部分名称缩小结果范围。大多数访问问题都追溯到权限差距或大小写敏感不匹配,一旦知道要查找什么,这两者都很容易解决。
如果您的工作超越查询表结构,进入跨系统保持数据同步的领域,英方软件 的 i2Stream 值得探索。它在事务级别处理实时 Oracle 复制,支持模式变更而无需人工干预,并可在不触碰生产服务器的情况下跨异构数据库环境工作。
公告
邮件
销售