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.
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.
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;
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
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+
: