查当前用户所有表用USER_TABLES视图,如scott用户执行SELECT table_name FROM USER_TABLES ORDER BY table_name;仅返回该用户拥有的常规堆表,不包含临时表、物化视图或外部表。

查当前用户所有表用 USER_TABLES
如果你登录的就是目标用户(比如用 scott 登录,想查 scott 自己的表),直接查 USER_TABLES 最快也最安全:
SELECT table_name FROM USER_TABLES ORDER BY table_name;
这个视图只返回当前用户拥有的表,不需权限,也不怕跨用户误查。注意它不包含临时表、物化视图或外部表——只管常规堆表。
查其他用户表必须用 ALL_TABLES 或 DBA_TABLES
想查别人(比如 hr)的表,得看你的权限:
- 有
SELECT_CATALOG_ROLE或对象权限?用ALL_TABLES,但只显示你被授权访问的那些表:SELECT table_name FROM ALL_TABLES WHERE owner = 'HR';
- 是 DBA?用
DBA_TABLES,能查全库所有用户下的表:SELECT table_name FROM DBA_TABLES WHERE owner = 'HR';
ALL_TABLES 和 DBA_TABLES 的 OWNER 字段是大写的用户名,传参时务必用单引号+大写,比如 'HR',小写 'hr' 会查不到(Oracle 默认转大写,但显式写小写可能因 NLS 设置异常)。
TABLE_NAME 字段里可能有大小写混用的表名?小心引号
如果某张表建的时候用了双引号(比如 CREATE TABLE "MyTable"),它的 TABLE_NAME 在数据字典里就是带大小写的字符串,但这种表名极难维护,日常几乎不用。绝大多数情况下你看到的 TABLE_NAME 都是纯大写,直接当标识符用没问题。
真正容易踩坑的是:别在 WHERE 条件里对 TABLE_NAME 做模糊匹配时漏掉通配符,比如写成 WHERE table_name LIKE 'EMP%' 是对的,但写成 WHERE table_name = 'EMP' 就只匹配表名恰好叫 EMP 的那一个。
为什么不用 SELECT * FROM TAB?
TAB 是个兼容性视图,字段少、含义模糊(比如 TABTYPE 可能是 'TABLE' 或 'VIEW'),而且不保证未来版本继续支持。Oracle 官方文档明确建议优先用 USER_TABLES/ALL_TABLES。另外,TAB 不区分大小写逻辑,也不过滤掉 IOT 的溢出段,结果容易多出几行你并不想要的“伪表”。
真要快速测试,TAB 能用;但写进脚本或交付代码里,就该换掉。


















