Получить список всех таблиц в Oracle?

1103

Как запросить базу данных Oracle, чтобы отобразить имена всех таблиц в ней?

vitule
источник
1
Работает ли SHOW TABLES(как в MySQL)?
Мартин Тома
1
@MartinThoma Нету. попробовал сначала, прежде чем прибегнуть к Google
Адам Берли

Ответы:

1366
SELECT owner, table_name
  FROM dba_tables

Это предполагает, что у вас есть доступ к представлению DBA_TABLESсловаря данных. Если у вас нет этих привилегий, но они нужны, вы можете запросить, чтобы администратор БД явно предоставил вам привилегии для этой таблицы, или чтобы администратор БД предоставил вам SELECT ANY DICTIONARYпривилегию или SELECT_CATALOG_ROLEроль (любая из которых позволит вам запросить любую таблицу словаря данных). ). Конечно, вы можете захотеть исключить определенные схемы, такие как SYSи SYSTEMимеющие большое количество таблиц 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 также имеет ряд устаревших данных словаря views-- TAB, DICT, TABSи CATдля example-- , которые можно было бы использовать. В целом, я бы не советовал использовать эти устаревшие представления, если вам абсолютно не нужно перенести свои сценарии в Oracle 6. Oracle не изменяла эти представления в течение длительного времени, поэтому у них часто возникают проблемы с объектами более новых типов. Например, TABи CATпредставления, и представления показывают информацию о таблицах, которые находятся в корзине пользователя, в то время как [DBA|ALL|USER]_TABLESвсе представления отфильтровывают их. CATтакже показывает информацию о материализованных журналах представлений с TABLE_TYPE«TABLE», что вряд ли будет тем, что вы действительно хотите. DICTобъединяет таблицы и синонимы и не говорит вам, кто владеет объектом.

Джастин Кейв
источник
9
Я получаю исключение "ORA-00942: таблица или представление не существует"
Vitule
46
Тогда вам не дали разрешение на просмотр всех таблиц в базе данных. Вы можете запросить представление словаря данных ALL_TABLES, чтобы увидеть все таблицы, к которым у вас есть доступ, которые могут быть небольшим подмножеством таблиц в базе данных.
Джастин Кейв
Простая ошибка, если не обычный пользователь sqlplus: добавьте конечную точку с запятой (';'), если вы просто не получаете результаты с помощью вышеуказанных команд :).
Кимхани
Просто обратите внимание, что в Oracle 12c в словаре данных dba_users есть столбец, помогающий удалить системные таблицы из набора результатов. Полный запрос будет SELECT владельца, имя_таблицы из dba_tables, где владелец не в (выберите имя пользователя из dba_users, где oracle_maintained = 'Y')
саритонин
181

Запрашивала user_tablesи dba_tablesне работала.
Этот сделал:

select table_name from all_tables  
vitule
источник
14
@LimitedAtonement Извините, это неправильно. Представление называется user_tables, а не user_table. Если user_tables не работает для vitule, что-то еще не так.
Фрэнк Шмитт
67

Если пойти еще дальше, есть еще одно представление с именем cols (all_tab_columns), которое можно использовать для определения того, какие таблицы содержат данное имя столбца.

Например:

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

найти все таблицы, имена которых начинаются с EST, и столбцы, содержащие CALLREF, где угодно в их именах.

Это может помочь при определении, к каким столбцам вы хотите присоединиться, например, в зависимости от вашей таблицы и соглашений об именах столбцов.

stealth_angoid
источник
4
Я сделал select * from colsи получил 0 строк.
Гейб
50

Для лучшего просмотра с 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;

Результаты

Это должно привести к чему-то, что выглядит довольно приемлемо, как:

результат

УХО
источник
8
спасибо за «лучший просмотр» советы, но вы не overwritting pagesize 30с pagesize 1000?
Пабло Рекальде
22

Простой запрос для выбора таблиц для текущего пользователя:

  SELECT table_name FROM user_tables;
Израиль Маргулис
источник
18
    select object_name from user_objects where object_type='TABLE';

----------------ИЛИ------------------

    select * from tab;

----------------ИЛИ------------------

    select table_name from user_tables;
Harshil
источник
15

Попробуйте следующие представления словаря данных.

tabs
dba_tables
all_tables
user_tables
Махмуд Ахмед Эль-Сайед
источник
9

Попробуйте выбрать из user_tables, в которой перечислены таблицы, принадлежащие текущему пользователю.

Эдди Авад
источник
8

С любым из них вы можете выбрать:

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';
Ван Гог
источник
6
select * from dba_tables

выдает все таблицы всех пользователей, только если пользователь, с которым вы вошли в систему, имеет sysdbaпривилегии.

praveen2609
источник
4
Это на самом деле не правильно. SYSDBA не требуется. Вы можете получить доступ к DBA_TABLES многими способами. 1.) Прямое предоставление пользователю объекта от SYS. 2.) Предоставление пользователю права ВЫБРАТЬ ЛЮБОЙ СЛОВАРЬ. 3.) Предоставление роли SELECT_CATALOG_ROLE.
Марк Дж. Бобак
4

Я не нашел ответа, который указывал бы на использование

DBA_ALL_TABLES (ALL_ALL_TABLES/USER_ALL_TABLES)

поэтому решил добавить и мою версию. Это представление фактически возвращает больше, чем DBA_TABLES, так как оно также возвращает таблицы объектов ( http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_1003.htm ).

ржавый
источник
4

Вы можете использовать Oracle Data Dictionary для получения информации об объектах оракула.

Вы можете получить список таблиц разными способами:

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

И вы можете использовать USERили ALLпредставления вместо, DBAесли вы хотите.

Слава Бабин
источник
4

В том числе просмотров:

SELECT owner, table_name as table_view
  FROM dba_tables
UNION ALL
SELECT owner, view_name as table_view
  FROM DBA_VIEWS
Punnerud
источник
4

Мы можем получить все таблицы, включая детали столбцов, из запроса ниже:

SELECT * FROM user_tab_columns;
aim_thebest
источник
4

Ниже приведен закомментированный фрагмент SQL-запросов, описывающий, как можно использовать параметры:

-- 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;
Прашант Мишра
источник
2

Следующий запрос только перечисляет необходимые данные, тогда как другие ответы дали мне дополнительные данные, которые только смутили меня.

select table_name from user_tables;
Матин
источник
2

Новая функция, доступная в SQLcl (который является бесплатным интерфейсом командной строки для Oracle Database):

Tables псевдоним.

Вот несколько примеров, показывающих использование и дополнительные аспекты функции. Сначала подключитесь к сеансу sqlкомандной строки ( sql.exeв windows). Рекомендуется вводить эту конкретную команду 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> alias tables_schema = select owner, table_name, last_analyzed from all_tables where owner = :ownr;

После этого вы можете просто передать имя схемы в качестве аргумента.

SQL> 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

Это покажет вам немного более сложный запрос вместе с предопределенными columnопределениями, обычно используемыми в SQL * Plus.

Джефф Смит объясняет больше об псевдонимах здесь

Каушик Наяк
источник
1

Я искал список всех имен столбцов, принадлежащих таблице схемы, отсортированный по порядку идентификатора столбца.

Вот запрос, который я использую: -

SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'schema_owner_username' AND TABLE_NAME='table_name'
ORDER BY COLUMN_ID ASC;
Ракеш Наранг
источник
1

Действительно, список таблиц можно получить с помощью запросов SQL. Это можно сделать также с помощью инструментов, которые позволяют создавать словари данных, такие как ERWIN , Toad Data Modeler или ERBuilder. . С этими инструментами, в дополнение к именам таблиц, у вас будут поля, их типы, объекты (триггеры, последовательности, домен, представления ...)

Ниже приведены шаги, которые необходимо выполнить для создания определения таблиц:

  1. Вы должны перепроектировать вашу базу данных
    • В Toad Data Modeler: Меню -> Файл -> Реверс-инженер -> Мастер реинжиниринга
    • В ERBuilder Data Modeler: Меню -> Файл -> Обратный инженер

Ваша база данных будет отображаться в программном обеспечении в виде диаграммы отношений сущностей.

  1. Создайте свой словарь данных, который будет содержать ваше определение таблиц
    • В Моделе данных жаб: Меню -> Модель -> Создать отчет -> Выполнить
    • В ERBuilder Data Modeler: Меню -> Инструмент -> создать документацию модели
parash
источник
0
select * from all_all_tables

это дополнительное «все» в начале дает дополнительные 3 столбца, которые:

OBJECT_ID_TYPE
TABLE_TYPE_OWNER
TABLE_TYPE
иметь дело с этим
источник
Так же, как этот ответ , нет?
mustaccio