Une pincée d'historique en 12cR2

Souhaitée depuis des années, l’historique des commandes SQL*Plus fait enfin son apparition avec la version 12c Release 2.
Pour les impatients, on peut voir cela dans le Cloud Oracle et le service DbaaS (Database as a Service) qui propose maintenant l’utilisation de la version 12.2.0.1. Pour cela, faites une demande pour un essai gratuit de 30 jours sur le site cloud.oracle.com et au moment de choisir la version de votre base vous aurez la possibilité de sélectionner cette Release 2 :
versionlogiciel
Vous pourrez prendre n’importe quelle édition disponible :
editionlogiciel
Une fois votre service créé, une connexion putty vous permet de vous connecter à votre base ORCL (conteneur racine, car l’architecture multitenant est utilisée d’office) :

[oracle@ELEORCL u01]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Wed Dec 21 14:52:05 2016
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c EE Extreme Perf Release 12.2.0.1.0 - 64bit Production
SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
         4 DEMOS                          MIGRATE    YES

Et de découvrir l’implémentation de la fonctionnalité.
En voici un tour rapide, où l’on voit qu’il n’y rien de complexe; l’aide nous montre les arguments possibles dans l’usage :

SQL> ? history
 HISTORY
 -------
 Stores, lists, executes, edits of the commands
 entered during the current SQL*Plus session.
 HIST[ORY] [N {RUN | EDIT | DEL[ETE]}] | [CLEAR]
 N is the entry number listed in the history list.
 Use this number to recall, edit or delete the command.
 Example:
 HIST 3 RUN - will run the 3rd entry from the list.
 HIST[ORY] without any option will list all entries in the list.

Le principal piège est de devoir d’abord positionner la fonction sur ON, sinon pas d’historique !
L’aide ne le dit pas, mais une tentative d’utilisation oui :

SQL> history
SP2-1650: History is off, use "SET HIST[ORY] ON" to enable History.

C’est parti :

SQL> set history on

Pour ne pas l’oublier, on passera la commande set dans votre fichier profile login.sql.
Déroulement de quelques commandes (dont le résultat peut vous surprendre mais qui sont parfaitement logiques dans le contexte multitenant) :

SQL> select count(*) from cdb_tables ;
  COUNT(*)
----------
      5209
SQL> select count(*) from dba_tables ;
  COUNT(*)
----------
      2602
SQL>  select count(*) from cdb_objects ;
  COUNT(*)
----------
    154492
SQL> select count(*) from dba_objects ;
  COUNT(*)
----------
     77582
SQL> select count(*) from cdb_users ;
  COUNT(*)
----------
        93
SQL> select count(*) from dba_users ;
  COUNT(*)
----------
        45

L’historique des commandes est maintenant visible et utilisable :

SQL> hist
  1  select count(*) from cdb_tables ;
  2  select count(*) from dba_tables ;
  3   select count(*) from cdb_objects ;
  4  select count(*) from dba_objects ;
  5  select count(*) from cdb_users ;
  6  select count(*) from dba_users ;

La syntaxe est là pour vous rappeler que c’est trop facile d’utiliser les flèches d’un clavier :

SQL> hist 3 run
  COUNT(*)
----------
    154492

Vous pouvez éditer et modifier la commande voulue avec :

SQL> hist 3 edit

qui ouvre l’éditeur et permet les modifications.
Supprimer cette entrée de l’historique :

SQL> hist 3 delete
SQL> hist
  1  select count(*) from cdb_tables ;
  2  select count(*) from dba_tables ;
  3  select count(*) from dba_objects ;
  4  select count(*) from cdb_users ;
  5  select count(*) from dba_users ;
  6   select count(*) from cdb_objects ;

Ou faire le grand ménage pour y voir plus clair !

SQL> hist clear
SQL> hist
SP2-1651: History list is empty.

Ce n’est pas encore l’aboutissement de nos rêves, il n’y a pas de recherche possible, pas de déplacement avec les flèches ou d’autres séquences de touches et pas de complétion possible. Son mérite est d’exister !
Pour quelque chose de plus évolué, il faut se tourner vers les solutions alternatives habituelles (rlwrap sous linux ou SQLCL dès que java est là.
A bientôt pour plus d’informations sur la version 12cR2…