web-dev-qa-db-fra.com

Comment puis-je décrire une table dans Oracle sans utiliser la commande DESCRIBE?

J'ai du mal avec un cours que je prends. Nous devons écrire un script Oracle qui agira exactement comme la commande DESCRIBE. Le livre que nous utilisons décrit très mal comment travailler avec le dictionnaire de données. Ne cherche pas de réponses, mais un point dans la bonne direction.

29
patricksweeney

Vous cherchez USER_TAB_COLUMNS - toutes les colonnes et leurs descriptions dans le schéma dans lequel la requête est exécutée - ou ALL_TAB_COLUMNS - le même sauf pour toutes les tables que l'utilisateur est autorisé à afficher.

Une requête typique peut être:

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

column_id est "l'ordre" de la colonne dans le tableau.

Vous devez vous assurer que "MY_TABLE" est en majuscule, sauf si vous avez ajouté des tables avec une casse (une mauvaise idée), auquel cas vous devez utiliser quelque chose comme = "MyTable".

Plus précisément, desc est équivalent à ce que j'ai volé ss64 , une bonne ressource 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';

Vous pouvez trouver tout ce genre de vue par select * from dictionary, qui est le niveau supérieur du dictionnaire de données ou en consultant le documentation .

Il y a aussi le DBA_TAB_COLUMNS, qui est identique à ALL_TAB_COLUMNS, mais pour chaque table de la base de données. Cela suppose que vous disposez des privilèges nécessaires pour l'afficher et les tables. Si vous n'avez pas accès à ce tableau, vous devez obtenir votre DBA pour vous accorder le SELECT ANY DICTIONARY privilège.

39
Ben

Vous pouvez également récupérer l'intégralité de la commande qui peut être utilisée pour recréer la table:

select dbms_metadata.get_ddl('TABLE','<my table name>','<table owner>') from dual;
14
Pop

Oracle a un ensemble de tables contenant des métadonnées sur la structure de la base de données. Il y a un tableau de tableaux. Une table de vues. Un tableau de colonnes. Vous pouvez interroger ces tables en utilisant des vues telles que USER_TABLES (tables dans votre schéma), ALL_TABLES (tables que vous êtes autorisé à afficher), DBA_TABLES (toutes les tables, si vous avez les privilèges). Plus généralement, de nombreux fournisseurs de bases de données prennent en charge le "schéma d'information" qui fournit une vue cohérente des métadonnées entre les fournisseurs. Recherchez "ALL_TABLES" ici et consultez toutes les autres informations disponibles http://docs.Oracle.com/cd/B28359_01/server.111/b28320/toc.htm

1
Glenn

Nouvellement introduite dans Oracle SQLcl est la commande information ou simplement INFO table_name. Il a une syntaxe simple comme 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

Sa sortie est de loin supérieure et descriptive par rapport à DESCRIBE. Il répertorie des informations plus détaillées sur les définitions de colonne pour une table, une vue ou un synonyme, ou sur les spécifications d'une fonction ou d'une procédure.

Par exemple: Ceci est la sortie que j'obtiens SQLcl: Release 18.1.1 lorsque je lance

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   

Voici une capture d'écran avec info+:

enter image description here

1
Kaushik Nayak