Как я могу описать таблицу в Oracle без использования команды DESCRIBE? - PullRequest
26 голосов
/ 25 марта 2012

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

Ответы [ 4 ]

36 голосов
/ 25 марта 2012

Вы ищете USER_TAB_COLUMNS - все столбцы и их описания в схеме, в которой выполняется запрос - или ALL_TAB_COLUMNS - то же самое, за исключением всехтаблицы, которые пользователь может просматривать.

Типичным запросом может быть:

select *
  from user_tab_columns
 where table_name = 'MY_TABLE'
 order by column_id

column_id - это «порядок» столбца в таблице.

Вы должны убедиться, что MY_TABLE написан с заглавной буквы, если только вы не добавляли таблицы с регистром (плохая идея), и в этом случае вам нужно использовать что-то вроде = "MyTable".

В частности, desc эквивалентно следующему, которое я украл из ss64 , хорошего ресурса Oracle:

select column_name as "Name"
     , nullable as "Null?"
     , concat(concat(concat(data_type,'('),data_length),')') as "Type"
  from user_tab_columns
 where table_name = 'MY_TABLE';

Вы можете найти все такого рода представленияна select * from dictionary, который является верхним уровнем словаря данных или просмотрев документацию .

Также существует DBA_TAB_COLUMNS, который являетсятакой же, как ALL_TAB_COLUMNS, но для каждой таблицы в базе данных.Это предполагает, что у вас есть права на просмотр как таблицы, так и таблицы.Если у вас нет доступа к этой таблице, вам необходимо получить от администратора базы данных права на SELECT ANY DICTIONARY.

14 голосов
/ 25 марта 2012

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

select dbms_metadata.get_ddl('TABLE','<my table name>','<table owner>') from dual;
1 голос
/ 26 мая 2018

Недавно введено в Oracle SQLcl - это команда information или просто INFO table_name. Он имеет простой синтаксис, такой как DESC[RIBE]:

SQL> info
INFORMATION
--------

This command is like describe but with more details about the objects requested.

INFO[RMATION] {[schema.]object[@connect_identifier]}
INFO+ will show column statistics

Его производительность намного выше и описательнее по сравнению с DESCRIBE. В нем содержится более подробная информация об определениях столбцов для таблицы, представления или синонима или спецификациях для функции или процедуры.

Например, : это вывод, который я получаю в SQLcl: выпуск 18.1.1 при запуске

info employees

SQL> info employees;
TABLE: EMPLOYEES 
     LAST ANALYZED:2018-05-26 15:07:58.0 
     ROWS         :107 
     SAMPLE SIZE  :107 
     INMEMORY     :DISABLED 
     COMMENTS     :employees table. Contains 107 rows. References with departments, 
                       jobs, job_history tables. Contains a self reference. 

Columns 
NAME             DATA TYPE           NULL  DEFAULT    COMMENTS
*EMPLOYEE_ID     NUMBER(6,0)         No               Primary key of employees table.
 FIRST_NAME      VARCHAR2(20 BYTE)   Yes              First name of the employee. A not null column.
 LAST_NAME       VARCHAR2(25 BYTE)   No               Last name of the employee. A not null column.
 EMAIL           VARCHAR2(25 BYTE)   No               Email id of the employee
 PHONE_NUMBER    VARCHAR2(20 BYTE)   Yes              Phone number of the employee; includes country
                                                      code and area code
 HIRE_DATE       DATE                No               Date when the employee started on this job. A not
                                                      null column.
 JOB_ID          VARCHAR2(10 BYTE)   No               Current job of the employee; foreign key to job_id
                                                      column of the jobs table. A not null column.
 SALARY          NUMBER(8,2)         Yes              Monthly salary of the employee. Must be greater
                                                      than zero (enforced by constraint emp_salary_min)
 COMMISSION_PCT  NUMBER(2,2)         Yes              Commission percentage of the employee; Only
                                                      employees in sales department elgible for
                                                      commission percentage
 MANAGER_ID      NUMBER(6,0)         Yes              Manager id of the employee; has same domain as
                                                      manager_id in departments table. Foreign key to
                                                      employee_id column of employees table.(useful for
                                                      reflexive joins and CONNECT BY query)
 DEPARTMENT_ID   NUMBER(4,0)         Yes              Department id where employee works; foreign key to
                                                      department_id column of the departments table

Indexes
INDEX_NAME             UNIQUENESS   STATUS   FUNCIDX_STATUS   COLUMNS                 
HR.EMP_JOB_IX          NONUNIQUE    VALID                     JOB_ID                  
HR.EMP_NAME_IX         NONUNIQUE    VALID                     LAST_NAME, FIRST_NAME   
HR.EMP_EMAIL_UK        UNIQUE       VALID                     EMAIL                   
HR.EMP_EMP_ID_PK       UNIQUE       VALID                     EMPLOYEE_ID             
HR.EMP_MANAGER_IX      NONUNIQUE    VALID                     MANAGER_ID              
HR.EMP_DEPARTMENT_IX   NONUNIQUE    VALID                     DEPARTMENT_ID           


References
TABLE_NAME    CONSTRAINT_NAME   DELETE_RULE   STATUS    DEFERRABLE       VALIDATED   GENERATED   
DEPARTMENTS   DEPT_MGR_FK       NO ACTION     ENABLED   NOT DEFERRABLE   VALIDATED   USER NAME   
EMPLOYEES     EMP_MANAGER_FK    NO ACTION     ENABLED   NOT DEFERRABLE   VALIDATED   USER NAME   
JOB_HISTORY   JHIST_EMP_FK      NO ACTION     ENABLED   NOT DEFERRABLE   VALIDATED   USER NAME   

Вот снимок экрана с info+:

enter image description here

1 голос
/ 25 марта 2012

Oracle имеет набор таблиц, содержащих метаданные о структуре базы данных.Есть таблица столов.Таблица просмотров.Таблица столбцов.Вы можете запросить эти таблицы с помощью представлений, таких как USER_TABLES (таблицы в вашей схеме), ALL_TABLES (таблицы, для которых у вас есть права на просмотр), DBA_TABLES (все таблицы, если у вас есть привилегии).В более общем смысле многие поставщики баз данных поддерживают «информационную схему», которая обеспечивает согласованное представление метаданных между поставщиками.Найдите «ALL_TABLES» здесь и посмотрите на всю другую доступную информацию http://docs.oracle.com/cd/B28359_01/server.111/b28320/toc.htm

...