tablas - ¿Cómo puedo describir una tabla en Oracle sin usar el comando DESCRIBE?
order by desc oracle (4)
Oracle tiene una tabla de conjunto que contiene metadatos sobre la estructura de la base de datos. Hay una tabla de tablas. Una tabla de vistas. Una tabla de columnas. Puede consultar estas tablas utilizando vistas como USER_TABLES (tablas en su esquema), ALL_TABLES (tablas que tiene permiso para ver), DBA_TABLES (todas las tablas, si tiene los privilegios). Más genéricamente, muchos proveedores de bases de datos admiten el "esquema de información" que proporciona una vista coherente de los metadatos entre los proveedores. Busque "ALL_TABLES" aquí y consulte toda la otra información disponible documentation
Estoy teniendo un momento difícil con una clase que estoy tomando. Necesitamos escribir un script de Oracle que actuará como el comando DESCRIBE. El libro que estamos utilizando describe cómo trabajar con el diccionario de datos muy mal. No buscando respuestas, sino un punto en la dirección correcta.
Recién introducido en Oracle SQLcl es el comando de information
o simplemente INFO table_name
. Tiene una sintaxis simple como 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
Su salida es muy superior y descriptiva en comparación con DESCRIBE
. Enumera información más detallada sobre las definiciones de columna para una tabla, vista o sinónimo, o las especificaciones para una función o procedimiento.
Por ejemplo : este es el resultado que obtengo en SQLcl: versión 18.1.1 cuando ejecuto
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
Aquí hay una captura de pantalla con info+
:
También puede recuperar el comando completo que se puede usar para recrear la tabla:
select dbms_metadata.get_ddl(''TABLE'',''<my table name>'',''<table owner>'') from dual;
Está buscando USER_TAB_COLUMNS
- todas las columnas, y sus descripciones en el esquema en el que se ejecuta la consulta - o ALL_TAB_COLUMNS
- el mismo excepto para todas las tablas que el usuario tiene permiso para ver.
Una consulta típica podría ser:
select *
from user_tab_columns
where table_name = ''MY_TABLE''
order by column_id
column_id
es el "orden" de la columna en la tabla.
Debe asegurarse de que ''MY_TABLE'' esté en mayúscula a menos que haya agregado tablas con mayúsculas y minúsculas (una mala idea), en cuyo caso deberá usar algo como = "MyTable"
.
Específicamente desc
es equivalente al siguiente que robé de ss64 , un buen recurso de 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'';
Puede encontrar todo este tipo de vista select * from dictionary
, que es el nivel superior del diccionario de datos o mirando la documentation .
También está DBA_TAB_COLUMNS
, que es lo mismo que ALL_TAB_COLUMNS
, pero para cada tabla en la base de datos. Esto supone que tiene los privilegios para ver tanto él como las tablas. Si no tiene acceso a esta tabla, necesita que su DBA le otorgue el privilegio de SELECT ANY DICTIONARY
.