SQLcl : obtenir des informations sur les objets - SQLcl: get information about objects
Introduction
SQLcl (SQL Command Line) est un utilitaire Java intégré dans Oracle depuis la 12.2, alors qu'auparavant il fallait l'installer à part. Il est basé sur l'outil gérant les scripts SQL de SQL Developer et, par rapport à SQL*Plus, il intègre de nouvelles commandes.
Aujourd'hui nous voyons celles permettant d'afficher les informations sur les objet et vous allez voir que sur ce point, SQLcl enfonce SQL*Plus.
Autres articles sur SQLcl : http://dbaoraclesql.canalblog.com/archives/sqlcl/index.html
Points d'attention
N/A.
Base de tests
Une base Oracle 19c multi-tenants.
Exemples
============================================================================================
Les commandes SQL*Plus pour afficher les infos d'une table
============================================================================================
On crée une table de test T1 sous SQL*Plus, pas sous SQLcl, avec les contraintes d'intégrité PK, Unique, Check, Not Null, un index sur une colonne et avec 100 000 lignes.
SQL> CREATE TABLE ZZ1 (
id number(8,0),
name varchar2(50) NOT NULL,
first_name varchar2(50) NOT NULL,
ID_EXT number(8) NOT NULL,
CONSTRAINT ZZ1_PK_ID PRIMARY KEY(id),
CONSTRAINT ZZ1_CK_UPPER_NAME CHECK (NAME=UPPER(name)),
CONSTRAINT ZZ1_UNI_ID_EXT UNIQUE(ID_EXT)
);
SQL> BEGIN
FOR i in 1..100000
LOOP
INSERT INTO ZZ1 values (i, 'JONES', 'Tom', i*10);
END LOOP;
END;
/
PL/SQL procedure successfully completed.
SQL> commit;
Commit complete.
Création d'un index sur la colonne first_name puis génération des stats sur la table et sur l'index.
SQL> CREATE INDEX IDX_ZZ1_FIRST_NAME on ZZ1(first_name);
Index created.
SQL> exec dbms_stats.gather_table_stats('HR', 'ZZ1');
PL/SQL procedure successfully completed.
SQL> exec dbms_stats.gather_index_stats('HR', 'IDX_ZZ1_FIRST_NAME');
PL/SQL procedure successfully completed.
Alors, quelles sont les informations disponibles sur cette table avec les commandes SQL*Plus, sans, bien sur, interroger directement les vues DBA_TABLES, DBA_INDEXES...
Sous SQL*PLUS, pour afficher les infos des objets il y a :
- desc
- DBMS_METADATA.GET_DDL
SQL*Plus DESC
Le DESC de SQL*Plus ne donne des informations que sur un nombre restreint d'objets : table, vue, synonyme, fonction, procédure. Le résultat du DESC est assez pauvre pour une table : il manque les contraintes d'intégrité autres que NOT NULL, il manque les index, si pour les colonnes VARCHAR2 la longueur est en BYTE ou CHAR etc etc
SQL> help desc
DESCRIBE
--------
Lists the column definitions for a table, view, or synonym, or the specifications for a function or procedure.
DESC[RIBE] {[schema.]object[@connect_identifier]}
SQL> desc ZZ1
Name Null? Type
--------------------------------------------------
ID NOT NULL NUMBER(8)
NAME NOT NULL VARCHAR2(50)
FIRST_NAME NOT NULL VARCHAR2(50)
ID_EXT NOT NULL NUMBER(8)
SQL*PLUS DBMS_METADATA.GET_DDL
La fonction dbms_metadata.get_ddl nous donne la définition d'un objet, sans la restriction des types d'objets du DESC. On notera que les informations sont plus détaillées que pour le DESC mais moins lisibles car polluées par d'innombrables paramètres techniques. Néanmoins, nous avons ici toutes les contraintes d'intégrité ainsi que les index associés aux contraintes PK et Unique. A noter qu'il manque l'index créé sur la colonne FIRST_NAME.
SQL> select dbms_metadata.get_ddl('TABLE', 'ZZ1', 'HR') from dual;
DBMS_METADATA.GET_DDL('TABLE','ZZ1','HR')
--------------------------------------------------------------------------------
CREATE TABLE "HR"."ZZ1"
( "ID" NUMBER(8,0),
"NAME" VARCHAR2(50) COLLATE "USING_NLS_COMP" NOT NULL ENABLE,
"FIRST_NAME" VARCHAR2(50) COLLATE "USING_NLS_COMP" NOT NULL ENABLE,
"ID_EXT" NUMBER(8,0) NOT NULL ENABLE,
CONSTRAINT "ZZ1_CK_UPPER_NAME" CHECK (NAME=UPPER(name)) ENABLE,
CONSTRAINT "ZZ1_PK_ID" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "ZZ1_UNI_ID_EXT" UNIQUE ("ID_EXT")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE
) DEFAULT COLLATION "USING_NLS_COMP" SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"
============================================================================================
Les commandes SQLcl pour afficher les infos d'une table
============================================================================================
ATTENTION : la commande pour lancer SQLcl s'appelle sqlui et non pas sqlcl... pourquoi faire simple quand on peut faire compliqué?
Son chemin est : /home/oracle/bin/sqlui
[oracle@localhost ~]$ . oraenv
ORACLE_SID = [orclcdb] ?
The Oracle base remains unchanged with value /u01/app/oracle
[oracle@localhost ~]$ sqlcl
bash: sqlcl: command not found...
[oracle@localhost ~]$ sqlui
SQLcl: Release 19.1 Production on Sat Mar 13 06:25:51 2021
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Username? (''?) HR
Password? (**********?) **
Last Successful login time: Sat Mar 13 2021 06:25:57 -05:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Sous SQLCl, les commandes pour afficher les infos des objets disponibles sont :
- desc
- info
- info+
- ddl
- DBMS_METADATA.GET_DDL
SQLcl DESC
Le DESC de SQLcl est comparable à celui de SQL*Plus.
SQL> help describe
DESCRIBE
--------
Lists the column definitions for a table, view, or synonym, or the specifications for a function or procedure.
DESC[RIBE] {[schema.]object[@connect_identifier]}
SQL> desc ZZ1
Name Null? Type
-----------------------------------------
ID NOT NULL NUMBER(8)
NAME NOT NULL VARCHAR2(50)
FIRST_NAME NOT NULL VARCHAR2(50)
ID_EXT NOT NULL NUMBER(8)
SQLcl INFORMATION
Mais SQLCl a une commande en plus, INFORMATION, qui donne des infos très intéressantes et se définit comme mieux que DESCRIBE.
SQL> help information
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
INFORMATION nous indique :
Pour la table
- la dernière fois que la table a été analysée pour générer les stats
- le nombre de lignes
- le nombre de lignes pour l'échantillonnage
- si elle est créée avec l'option INMEMORY
- quel est le commentaire associé à l'objet
Pour les colonnes (pas de ligne qui souligne les colonnes, c'est bizarre):
- quelle est la colonne Primary Key, avec un astérisque devant celle-ci
- le nom
- le type
- si NULL est permis ou non
- la valeur par défaut
- le commentaire associé
Pour les indexes
- le nom
- si l'index est unique ou non
- son statut
- s'il est basé sur une fonction
- et, bien sur, quelle est la colonne indexée
SQL> info zz1
TABLE: ZZ1
LAST ANALYZED:2021-03-11 10:16:11.0
ROWS :100000
SAMPLE SIZE :100000
INMEMORY :DISABLED
COMMENTS :
Columns
NAME DATA TYPE NULL DEFAULT COMMENTS
*ID NUMBER(8,0) No
NAME VARCHAR2(50 BYTE) No
FIRST_NAME VARCHAR2(50 BYTE) No
ID_EXT NUMBER(8,0) No
Indexes
INDEX_NAME UNIQUENESS STATUS FUNCIDX_STATUS COLUMNS
________________________ _____________ _________ _________________ _____________
HR.ZZ1_PK_ID UNIQUE VALID ID
HR.ZZ1_UNI_ID_EXT UNIQUE VALID ID_EXT
HR.IDX_ZZ1_FIRST_NAME NONUNIQUE VALID FIRST_NAME
SQLcl INFO+
La commande INFO a un petit frère : INFO+ qui montre, comme le dit l'aide, les stats sur les colonnes.
Par rapport à INFO, nous obtenons en plus les données suivantes pour chaque colonne mais nous avons perdu la colonne COMMENTS; dommage.
- LOW_VALUE
- HIGH_VALUE
- NUM_DISTINCT
- HISTOGRAM
SQL> info+ zz1
TABLE: ZZ1
LAST ANALYZED:2021-03-11 10:16:11.0
ROWS :100000
SAMPLE SIZE :100000
INMEMORY :DISABLED
COMMENTS :
Columns
NAME DATA TYPE NULL DEFAULT LOW_VALUE HIGH_VALUE NUM_DISTINCT HISTOGRAM
*ID NUMBER(8,0) No 1 100000 100000 NONE
NAME VARCHAR2(50 BYTE) No JONES JONES 1 NONE
FIRST_NAME VARCHAR2(50 BYTE) No Tom Tom 1 NONE
ID_EXT NUMBER(8,0) No 10 1000000 100000 NONE
Indexes
INDEX_NAME UNIQUENESS STATUS FUNCIDX_STATUS COLUMNS
________________________ _____________ _________ _________________ _____________
HR.ZZ1_PK_ID UNIQUE VALID ID
HR.ZZ1_UNI_ID_EXT UNIQUE VALID ID_EXT
HR.IDX_ZZ1_FIRST_NAME NONUNIQUE VALID FIRST_NAME
SQLcl DBMS_METADATA.GET_DDL
Le résultat de dbms_metadata.get_ddl est identique, sous SQLCl à celui de SQL*Plus.
SQL> select dbms_metadata.get_ddl('TABLE', 'ZZ1', 'HR') from dual;
DBMS_METADATA.GET_DDL('TABLE','ZZ1','HR')
--------------------------------------------------------------------------------
CREATE TABLE "HR"."ZZ1"
( "ID" NUMBER(8,0),
"NAME" VARCHAR2(50) COLLATE "USING_NLS_COMP" NOT NULL ENABLE,
"FIRST_NAME" VARCHAR2(50) COLLATE "USING_NLS_COMP" NOT NULL ENABLE,
"ID_EXT" NUMBER(8,0) NOT NULL ENABLE,
CONSTRAINT "ZZ1_CK_UPPER_NAME" CHECK (NAME=UPPER(name)) ENABLE,
CONSTRAINT "ZZ1_PK_ID" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "ZZ1_UNI_ID_EXT" UNIQUE ("ID_EXT")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE
) DEFAULT COLLATION "USING_NLS_COMP" SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"
SQLcl DDL
La commande DDL est nouvelle aussi sous SQLCl même si elle appelle en sous-main dbms_metadata.get_ddl. La première partie du résultat est identique à dbms_metadata.get_ddl ci-dessus mais, en plus, nous avons la définition de l'index créé à la main sur la colonne FIRST_NAME. Avec dbms_metadata.get_ddl on a les définitions des index associés aux contraintes d'intégrité PRIMARY KEY et UNIQUE mais pas aux index créés avec la fonction CREATE INDEX. La commande DDL est donc plus puissante.
SQL> help ddl
DDL
---
DDL generates the code to reconstruct the object listed. Use the type option for materialized views. Use the save options to save the DDL to a file.
DDL [<object_name> [<type>] [SAVE <filename>]]
SQL> ddl zz1
CREATE TABLE "HR"."ZZ1"
( "ID" NUMBER(8,0),
"NAME" VARCHAR2(50) COLLATE "USING_NLS_COMP" NOT NULL ENABLE,
"FIRST_NAME" VARCHAR2(50) COLLATE "USING_NLS_COMP" NOT NULL ENABLE,
"ID_EXT" NUMBER(8,0) NOT NULL ENABLE,
CONSTRAINT "ZZ1_CK_UPPER_NAME" CHECK (NAME=UPPER(name)) ENABLE,
CONSTRAINT "ZZ1_PK_ID" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "ZZ1_UNI_ID_EXT" UNIQUE ("ID_EXT")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE
) DEFAULT COLLATION "USING_NLS_COMP" SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
CREATE INDEX "HR"."IDX_ZZ1_FIRST_NAME" ON "HR"."ZZ1" ("FIRST_NAME")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
Le résultat est difficilement lisible. Sous SQLCl, il y a une commande FORMAT qui peut nous sortir de l'embarras en formatant le résultat stocké dans le buffer mémoire.
SQL> format buffer
1 CREATE TABLE "HR"."ZZ1" (
2 "ID" NUMBER(8, 0),
3 "NAME" VARCHAR2(50) COLLATE "USING_NLS_COMP"
4 NOT NULL ENABLE,
5 "FIRST_NAME" VARCHAR2(50) COLLATE "USING_NLS_COMP"
6 NOT NULL ENABLE,
7 "ID_EXT" NUMBER(8, 0)
8 NOT NULL ENABLE,
9 CONSTRAINT "ZZ1_CK_UPPER_NAME" CHECK ( name = upper(name) ) ENABLE,
10 CONSTRAINT "ZZ1_PK_ID" PRIMARY KEY ( "ID" )
11 USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
12 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
13 DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
14 TABLESPACE "USERS"
15 ENABLE,
16 CONSTRAINT "ZZ1_UNI_ID_EXT" UNIQUE ( "ID_EXT" )
17 USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
18 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
19 DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
20 TABLESPACE "USERS"
21 ENABLE
22 ) DEFAULT COLLATION "USING_NLS_COMP"
23 SEGMENT CREATION IMMEDIATE
24 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
25 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
26 DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
27 TABLESPACE "USERS";
28
29 CREATE INDEX "HR"."IDX_ZZ1_FIRST_NAME" ON
30 "HR"."ZZ1" (
31 "FIRST_NAME"
32 )
33 PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
34 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
35 DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT )
36* TABLESPACE "USERS";
============================================================================================
Les commandes SQLcl d'information sur des objets autres qu'une table
============================================================================================
Et avec un index, nous avons quelles infos? Visiblement c'est un appel à dbms_metadata.get_ddl qui est fait.
SQL> info HR.IDX_ZZ1_FIRST_NAME
CREATE INDEX "HR"."IDX_ZZ1_FIRST_NAME" ON "HR"."ZZ1" ("FIRST_NAME")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
SQL> info+ HR.IDX_ZZ1_FIRST_NAME
CREATE INDEX "HR"."IDX_ZZ1_FIRST_NAME" ON "HR"."ZZ1" ("FIRST_NAME")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
Et avec un user?
Création sous SQL*Plus du user U1 avec un rôle, un droit objet, un droit système.
[oracle@localhost ~]$ sqlplus SYS@orcl as sysdba
SQL> CREATE USER U1 IDENTIFIED BY U1;
User created.
SQL> GRANT CONNECT, DBA TO U1;
Grant succeeded.
SQL> GRANT SELECT ON HR.REGIONS to U1;
Grant succeeded.
Sous SQL*Plus, erreur car desc ne gère pas les users.
SQL> desc U1;
ERROR:
ORA-04043: object U1 does not exist
La fonction dbms_metadata.get_ddl ne nous donne pas les droits et rôles du user.
SQL> select dbms_metadata.get_ddl('USER', 'U1') from dual;
DBMS_METADATA.GET_DDL('USER','U1')
--------------------------------------------------------------------------------
CREATE USER "U1" IDENTIFIED BY VALUES 'S:12E1824297E747866AD6C620E77B5C651AEB
DE50D17793099FB9F22F6320;T:394AD41E8E2E99CD78E3AC4034C343806B951EDF31B7EB3E17CDA
68DBA63579C32256B2B0DD2AE215655BD0F846DA84CC9083119F27397960EC90AD774AD56E850B63
43B8D6097487FB2EEE1F9A32D2F' DEFAULT COLLATION "USING_NLS_COMP"
DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP"
Idem sous SQLcl, les users ne sont pas gérés; dommage car afficher en une seule commande le code DDL d'un user, la liste de ses droits et ses rôles, cela eut été classe.
SQL> desc U1;
ERROR:
ORA-04043: object U1 does not exist
SQL> info U1
Object Not Found: U1
SQL> info u1
Object Not Found: u1
SQL> info+ U1;
Object Not Found: U1
SQL> ddl U1;
Object U1 not found
SQL> select dbms_metadata.get_ddl('USER', 'U1') from dual;
DBMS_METADATA.GET_DDL('USER','U1')
--------------------------------------------------------------------------------
CREATE USER "U1" IDENTIFIED BY VALUES 'S:12E1824297E747866AD6C620E77B5C651AEB
DE50D17793099FB9F22F6320;T:394AD41E8E2E99CD78E3AC4034C343806B951EDF31B7EB3E17CDA
68DBA63579C32256B2B0DD2AE215655BD0F846DA84CC9083119F27397960EC90AD774AD56E850B63
43B8D6097487FB2EEE1F9A32D2F' DEFAULT COLLATION "USING_NLS_COMP"
DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP";
Conclusion
En conclusion, on voit bien que les commandes SQLcl pour afficher des infos sur une table sont plus puissantes que le DESC de SQL*Plus; les commandes INFO+ et DDL à elles seules méritent qu'on utilise cet utilitaire.