Comment 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 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 d'un point dans la bonne direction.

26
demandé sur patricksweeney 2012-03-25 00:15:46

4 réponses

Vous êtes à la recherche pour USER_TAB_COLUMNS - toutes les colonnes, et leurs descriptions dans le schéma de la requête est exécutée dans - ou ALL_TAB_COLUMNS - les mêmes sauf pour toutes les tables que l'Utilisateur a la permission de voir.

Une requête typique pourrait être:

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

column_id est l '"ordre" de la colonne du tableau.

vous devez vous assurer que 'MY_TABLE' est capitalisé sauf si vous avez ajouté des tables avec boîtier (une mauvaise idée ) dans lequel cas, vous devez utiliser quelque chose comme = "MyTable".

spécifiquement desc est l'équivalent de ce que j'ai volé à ss64, une bonne Oracle de la ressource:

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 tous ce genre de vue par select * from dictionary, qui est le niveau supérieur de l' dictionnaire de données ou en regardant le documentation.

Il y a aussi le DBA_TAB_COLUMNS, qui est le même que ALL_TAB_COLUMNS, mais pour chaque table de la base de données. Cela suppose que vous avez les privilèges pour voir à la fois lui et les tables. Si vous n'avez pas accès à cette table, vous devez obtenir votre DBA pour vous accorder le SELECT ANY DICTIONARY privilège.

32
répondu Ben 2012-03-24 20:56:29

Vous pouvez également récupérer la commande entière qui peut être utilisée pour recréer la table:

select dbms_metadata.get_ddl('TABLE','<my table name>','<table owner>') from dual;
14
répondu Pop 2012-03-24 23:03:41

Oracle dispose d'un ensemble de tables contenant des métadonnées sur la structure de la base de données. Il est un tableau de tableaux. Un tableau de points de vue. 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 avez la permission de visualiser), 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 parmi les fournisseurs. Recherche pour "ALL_TABLES" ici et regardez toutes les autres informations disponibles http://docs.oracle.com/cd/B28359_01/server.111/b28320/toc.htm

1
répondu Glenn 2012-03-24 20:28:39

Nouvellement introduit dans Oracle SQLcl est le information commande ou tout 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 contient des informations plus détaillées sur les définitions de colonnes d'un tableau, d'une vue ou d'un synonyme, ou sur les spécifications d'une fonction ou d'une procédure.

Par exemple: C'est le résultat que j'obtiens SQLcl: Release 18.1.1 quand 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

0
répondu Kaushik Nayak 2018-05-26 18:23:36