【问题标题】:Get list of all tables in Oracle?获取Oracle中所有表的列表?
【发布时间】:2010-09-17 08:54:21
【问题描述】:

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

【问题讨论】:

  • SHOW TABLES(在 MySQL 中所做的)是否有效?
  • @MartinThoma 不。在求助于谷歌之前先尝试过

标签: sql oracle


【解决方案1】:
SELECT owner, table_name
  FROM dba_tables

这是假设您有权访问 DBA_TABLES 数据字典视图。如果您没有这些权限但需要它们,您可以请求 DBA 显式授予您对该表的权限,或者 DBA 授予您SELECT ANY DICTIONARY 权限或SELECT_CATALOG_ROLE 角色(其中任何一个都允许您查询任何数据字典表)。当然,您可能希望排除某些架构,例如 SYSSYSTEM,它们包含大量您可能不关心的 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 也有许多遗留数据字典视图——例如TABDICTTABSCAT——可以使用。一般来说,除非您绝对需要将脚本反向移植到 Oracle 6,否则我不建议使用这些旧视图。Oracle 已经很长时间没有更改这些视图,因此它们经常在使用较新类型的对象时遇到问题。例如,TABCAT 视图都显示有关用户回收站中的表的信息,而[DBA|ALL|USER]_TABLES 视图都将这些信息过滤掉。 CAT 还显示有关物化视图日志的信息,其中包含“TABLE”的 TABLE_TYPE,这不太可能是您真正想要的。 DICT 结合了表格和同义词,并没有告诉您谁拥有该对象。

【讨论】:

  • 那么你没有被授予查看数据库中所有表的权限。您可以查询 ALL_TABLES 数据字典视图以查看您被允许访问的所有表,这些表可能是数据库中表的一小部分。
【解决方案2】:

查询 user_tablesdba_tables 无效。
这个做到了:

select table_name from all_tables  

【讨论】:

  • @LimitedAtonement 抱歉,这完全是错误的。该视图称为 user_tables,而不是 user_table。如果 user_tables 对 vitule 不起作用,那么还有其他问题。
【解决方案3】:

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

例如:

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

查找名称以 EST 开头的所有表以及名称中任何位置包含 CALLREF 的列。

这有助于确定要加入哪些列,例如,取决于您的表和列命名约定。

【讨论】:

  • 我做了select * from cols 并返回了 0 行。
【解决方案4】:

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

结果

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

【讨论】:

    【解决方案5】:

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

      SELECT table_name FROM user_tables;
    

    【讨论】:

      【解决方案6】:
          select object_name from user_objects where object_type='TABLE';
      

      --或------------------

          select * from tab;
      

      --或------------------

          select table_name from user_tables;
      

      【讨论】:

        【解决方案7】:

        试试下面的数据字典视图。

        tabs
        dba_tables
        all_tables
        user_tables
        

        【讨论】:

          【解决方案8】:

          Oracle 数据库使用以下查询显示所有表的名称

          从 dba_tables 中选择所有者、表名; 从所有表中选择所有者,表名; 从用户表中选择表名;

          访问更多:http://www.plsqlinformation.com/2016/08/get-list-of-all-tables-in-oracle.html

          【讨论】:

            【解决方案9】:

            尝试从列出当前用户拥有的表的user_tables 中进行选择。

            【讨论】:

              【解决方案10】:

              其中任何一个,您都可以选择:

              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';
              

              【讨论】:

                【解决方案11】:
                select * from dba_tables
                

                仅当您登录的用户具有sysdba 权限时,才提供所有用户的所有表。

                【讨论】:

                • 这实际上是不正确的。不需要 SYSDBA。您可以通过多种方式访问​​ DBA_TABLES。 1.) SYS 将对象直接授予用户。 2.) 授予用户 SELECT ANY DICTIONARY 特权。 3.) 授予 SELECT_CATALOG_ROLE 角色。
                【解决方案12】:

                执行以下命令:

                显示 Oracle 数据库中的所有表

                sql> SELECT table_name FROM dba_tables;

                显示当前用户拥有的表

                sql> SELECT table_name FROM user_tables;

                显示当前用户可以访问的表格

                sql> SELECT table_name FROM all_tables ORDER BY table_name;

                【讨论】:

                  【解决方案13】:

                  我没有找到指向使用的答案

                  DBA_ALL_TABLES (ALL_ALL_TABLES/USER_ALL_TABLES)
                  

                  所以决定也添加我的版本。 这个视图实际上返回了比 DBA_TABLES 更多的数据,因为它还返回了对象表 (http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_1003.htm)。

                  【讨论】:

                    【解决方案14】:

                    您可以使用Oracle Data Dictionary 获取有关oracle 对象的信息。

                    您可以通过不同的方式获取表格列表:

                    select * 
                    from dba_tables
                    

                    或者例如:

                    select * 
                    from dba_objects 
                    where object_type = 'TABLE' 
                    

                    然后就可以使用表名获取表列了:

                    select * 
                    from dba_tab_columns
                    

                    然后你可以得到依赖列表(触发器、视图等):

                    select * 
                    from dba_dependencies
                    where referenced_type='TABLE' and referenced_name=:t_name 
                    

                    然后你可以得到这个对象的文本源:

                    select * from dba_source
                    

                    如果需要,您可以使用 USERALL 视图代替 DBA

                    【讨论】:

                      【解决方案15】:

                      包括视图:

                      SELECT owner, table_name as table_view
                        FROM dba_tables
                      UNION ALL
                      SELECT owner, view_name as table_view
                        FROM DBA_VIEWS
                      

                      【讨论】:

                        【解决方案16】:

                        我们可以从下面的查询中获取所有表,包括列详细信息:

                        SELECT * FROM user_tab_columns;
                        

                        【讨论】:

                          【解决方案17】:

                          以下是 SQL 查询的注释 sn-p,描述了您可以如何使用选项:

                          -- need to have select catalog role
                          SELECT * FROM dba_tables;
                          
                          -- to see tables of your schema
                          SELECT * FROM user_tables;
                          
                          -- tables inside your schema and tables of other schema which you possess select grants on
                          SELECT * FROM all_tables;
                          

                          【讨论】:

                            【解决方案18】:

                            SQLcl(这是一个免费的 Oracle 数据库命令行界面)中提供的一个新功能是

                            Tables 别名。

                            这里有几个示例展示了该功能的用法和其他方面。首先,连接到sql 命令行(Windows 中的sql.exe)会话。建议在运行任何其他显示数据的命令或查询之前输入此 sqlcl 特定命令。

                            SQL> set sqlformat ansiconsole     -- resizes the columns to the width of the 
                                                               -- data to save space 
                            

                            SQL> tables

                            TABLES
                            -----------
                            REGIONS
                            LOCATIONS
                            DEPARTMENTS
                            JOBS
                            EMPLOYEES
                            JOB_HISTORY
                            ..
                            

                            要知道tables 别名指的是什么,您可以简单地使用alias list <alias>

                            SQL> alias list tables
                            tables - tables <schema> - show tables from schema
                            --------------------------------------------------
                            
                             select table_name "TABLES" from user_tables
                            

                            您不必定义此别名,因为它在 SQLcl 下默认提供。如果您想列出来自特定模式的表,使用新的用户定义别名并将模式名称作为绑定参数传递,并且只显示一组列,您可以使用

                            SQL&gt; alias tables_schema = select owner, table_name, last_analyzed from all_tables where owner = :ownr;

                            此后您可以简单地将架构名称作为参数传递

                            SQL&gt; tables_schema HR

                            OWNER   TABLE_NAME               LAST_ANALYZED
                            HR      DUMMY1                   18-10-18
                            HR      YOURTAB2                 16-11-18
                            HR      YOURTABLE                01-12-18
                            HR      ID_TABLE                 05-12-18
                            HR      REGIONS                  26-05-18
                            HR      LOCATIONS                26-05-18
                            HR      DEPARTMENTS              26-05-18
                            HR      JOBS                     26-05-18
                            HR      EMPLOYEES                12-10-18
                            ..
                            ..
                            

                            一个更复杂的预定义别名称为 Tables2,它显示其他几个列。

                            SQL> tables2
                            
                            Tables
                            ======
                            TABLE_NAME                 NUM_ROWS   BLOCKS   UNFORMATTED_SIZE COMPRESSION     INDEX_COUNT   CONSTRAINT_COUNT   PART_COUNT LAST_ANALYZED
                            AN_IP_TABLE                       0        0                  0 Disabled                  0                  0            0 > Month
                            PARTTABLE                         0        0                  0                           1                  0            1 > Month
                            TST2                              0        0                  0 Disabled                  0                  0            0 > Month
                            TST3                              0        0                  0 Disabled                  0                  0            0 > Month
                            MANAGE_EMPLYEE                    0        0                  0 Disabled                  0                  0            0 > Month
                            PRODUCT                           0        0                  0 Disabled                  0                  0            0 > Month
                            ALL_TAB_X78EHRYFK                 0        0                  0 Disabled                  0                  0            0 > Month
                            TBW                               0        0                  0 Disabled                  0                  0            0 > Month
                            DEPT                              0        0                  0 Disabled                  0                  0            0 > Month
                            

                            要知道它在后台运行什么查询,请输入

                            alias list tables2
                            

                            这将向您展示一个稍微复杂的查询以及 SQL*Plus 中常用的预定义 column 定义。

                            Jeff Smith 详细解释了别名 here

                            【讨论】:

                              【解决方案19】:

                              下面的查询只列出了所需的数据,而其他答案给了我额外的数据,这让我很困惑。

                              select table_name from user_tables;
                              

                              【讨论】:

                                【解决方案20】:

                                我正在寻找属于按列 ID 顺序排序的模式表的所有列名称的列表。

                                这是我正在使用的查询:-

                                SELECT COLUMN_NAME
                                FROM ALL_TAB_COLUMNS
                                WHERE OWNER = 'schema_owner_username' AND TABLE_NAME='table_name'
                                ORDER BY COLUMN_ID ASC;
                                

                                【讨论】:

                                  【解决方案21】:

                                  确实,可以通过 SQL 查询获得表列表。也可以通过允许生成数据字典的工具来实现,例如 ERWINToad Data ModelerERBuilder。使用这些工具,除了表名之外,您还将拥有字段、它们的类型、对象,例如(触发器、序列、域、视图...)

                                  生成表格定义的步骤如下:

                                  1. 您必须对数据库进行逆向工程
                                    • 在 Toad 数据建模器中:菜单 -> 文件 -> 逆向工程 -> 逆向工程向导
                                    • 在 ERBuilder 数据建模器中:菜单 -> 文件 -> 逆向工程

                                  您的数据库将在软件中显示为实体关系图。

                                  1. 生成包含表定义的数据字典
                                    • 在 Toad 数据建模器中:菜单 -> 模型 -> 生成报告 -> 运行
                                    • 在 ERBuilder 数据建模器中:菜单 -> 工具 -> 生成模型文档

                                  【讨论】:

                                    【解决方案22】:
                                    select * from all_all_tables
                                    

                                    开头的这个额外的“全部”给出了额外的 3 列,它们是:

                                    OBJECT_ID_TYPE
                                    TABLE_TYPE_OWNER
                                    TABLE_TYPE
                                    

                                    【讨论】:

                                    【解决方案23】:

                                    当前用户中的表 - 登录架构

                                    select * from tabs;
                                    

                                    【讨论】:

                                      【解决方案24】:

                                      要获取所有表名,我们可以使用:

                                      Select  owner, table_name  from all_tables;
                                      

                                      如果你有 dba 权限,你可以使用:

                                      Select owner, table_name from dba_tables;
                                      

                                      【讨论】:

                                        猜你喜欢
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2012-01-29
                                        • 1970-01-01
                                        • 2021-10-11
                                        • 2010-10-18
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多