Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Blog d'un DBA sur le SGBD Oracle et SQL
28 mars 2021

SQLcl : nouvelles commandes HISTORY, TABULATION, ALIAS, REPEAT - SQLcl: new HISTORY, TABULATION, ALIAS, REPEAT commands

 

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 intègre de nouvelles commandes par rapport à SQL*Plus. Aujourd'hui nous allons en voir quatre : HISTORY, la touche de tabulation, ALIAS et REPEAT.

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 nouvelles commandes SQLcl
============================================================================================
Attention, pour lancer SQLcl, la commande est sqlui.

     [oracle@localhost ~]$ . oraenv
     ORACLE_SID = [orclcdb] ?

     [oracle@localhost ~]$ sqlui HR@orcl
     SQLcl: Release 19.1 Production on Sun Mar 28 10:31:15 2021

Les nouvelles commandes SQLcl, inconnues de SQL*Plus, sont précédées d'un astérisque, 
     SQL> help

     For help on a topic type help <topic>
     List of Help topics available:

     /
     @
     @@
     ACCEPT
     ALIAS*
     APEX*
     APPEND
     ARCHIVE_LOG
     BREAK
     BRIDGE*
     BTITLE
     CD*
     CHANGE
     CLEAR
     COLUMN
     COMPUTE
     CONNECT
     COPY
     CTAS*
     DDL*
     DEFINE
     DEL
     DESCRIBE
     DISCONNECT
     EDIT
     EXECUTE
     EXIT
     FIND*
     FORMAT*
     GET
     HISTORY*
     HOST
     INFORMATION*
     INPUT
     LIST
     LOAD*
     NET*
     OERR*
     PASSWORD
     PAUSE
     PRINT
     PROMPT
     QUIT
     REMARK
     REPEAT*
     RESERVED_WORDS
     REST*
     RUN
     SAVE
     SCRIPT*
     SET
     SETERRORL
     SHOW
     SHUTDOWN
     SODA*
     SPOOL
     SSHTUNNEL*
     START
     STARTUP
     STORE
     TIMING
     TNSPING*
     TTITLE
     UNDEFINE
     VARIABLE
     VAULT*
     WHENEVER
     WHICH*
     XQUERY

============================================================================================
La commande HISTORY
============================================================================================
 
HISTORY et SQL*Plus
Cette commande existe aussi sous SQL*Plus mais elle est bien plus pauvre.
     SQL> help 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.

HISTORY et SQLcl
Cette fonctionnalité est installée par défaut dans SQLcl, pas besoin de faire un SET HISTORY ON comme sous SQL*Plus.
          - par défaut, elle enregistre les 100 dernières commandes mais cette limite est modifiable
          - l'historique est maintenu d'une session à l'autre. Celui-ci est stocké dans le répertoire $HOME de l'OS
          - après avoir rappelé une commande, il est possible d'éditer celle-ci avec les flèches Droite et Gauche
          - accès aux commandes de deux façons
                    - utilisation des flèches Haut et Bas
                    - utilisation de la commande HISTORY

La commande help donne des exemples mais est muette en explications.
     SQL> help history
     HISTORY
     ---------
     history [<index> | FULL | USAGE | SCRIPT | TIME | CLEAR (SESSION)?]

     SQL>history full
     1 select 1 from dual;
     2 select 2
     > from dual;
     3 select 3 from dual
     > where 1=1;

     SQL>history usage

     1 (2) select 1 from dual;
     2 (11) select 2 from dual;
     3 (2) select 3 from dual where 1=1;

     SQL>history script

     select 1 from dual;
     select 2 from dual;
     select 3 from dual where 1=1;

     SQL>history 3

     1 select 3 from dual
     2* where 1=1;

     SQL>his time

     1 clear
     2 cl bre
     3 (00.201) select 1 from dual

Pour paramétrer cette commande, il faut faire un SET HISTORY option. La commande help permet de voir les options disponibles.
     SQL> help set history
     SET HISTORY
     ---------

     set history [FAILS [LIMIT [ n | DEFAULT ] ] | NOFAILS

     |BLACKLIST [DEFAULT <command list>?|<command list>?]
     |LIMIT [n|DEFAULT]]

     FAILS sets history command to show failed statements.

     use limit to limit number of failues
     NOFAILS sets history command to not show failed statements
     BLACKLIST sets a list of sqlcl commands that can be excluded from the history
     LIMIT sets a new max size for the history

     NB. History will not save failed commands at end of session.


On note que certaines commandes sont filtrées et que celles ayant échoué ne sont pas enregistrées. La commande CONNECT notamment est filtrée et n'affichera donc pas de password. Possibilité de changer le nombre de commandes enregistrées : si on modifie un paramètre par défaut, sa nouvelle valeur apparaît dans le SHOW HISTORY.
     SQL> show hist
     HISTORY
          enabled
          blacklist: show,history,connect,set
          Do not show failed statements

     SQL> set history limit 256

     SQL> show hist
     HISTORY
          enabled
          blacklist: show,history,connect,set
          Do not show failed statements
          Max Size: 256

Comme exemple, on va afficher les commandes exécutées; pour info, je ne vois pas aucune différence entre HISTORY et HISTORY FULL.
     SQL> history
     History:
          1 select count(*) from ZZ1;
          2 desc ZZ1

Afficher les commandes exécutées avec leur temps d'exécution. Cela est possible car en interne Oracle ajoute la commande SET TIMING ON à chaque requête.
     SQL> history time
     1 (00.109) select count(*) from ZZ1;
     2 (00.103) desc ZZ1

Afficher les commandes exécutées avec le nombre d'occurences.
     SQL> history usage
     1 (2) select count(*) from ZZ1;
     2 (3) desc ZZ1

L'option FULL est a priori idem que HISTORY sinon qu'il y a un saut de ligne entre chaque commande.
     SQL> history full
     1 select count(*) from ZZ1;

     2 desc ZZ1

On peut aussi modifier la liste des commandes blacklistées. Bizarrement ça ne prends pas en compte la commande DESC, que ce soit en majuscule ou en minuscules.
     SQL> set history blacklist DESC

     
SQL> show history

     HISTORY
          enabled
          blacklist: DESC
          Do not show failed statements
          Max Size: 256

     SQL> history
     History:
          1 select count(*) from ZZ1;
          2 desc ZZ1
          3 set history blacklist DESC
          4 show history

     SQL> set history blacklist desc

     SQL> show hist
     HISTORY
          enabled
          blacklist: desc
          Do not show failed statements
          Max Size: 256

     SQL> hist
     History:
          1 select count(*) from ZZ1;
          2 desc ZZ1
          3 set history blacklist DESC
          4 show history
          5 set history blacklist desc
          6 show hist

Réinitialisation de l'historique avec l'option CLEAR.
     SQL> history clear
     History Cleared


============================================================================================
La touche TABULATION
============================================================================================

Avec SQLcl, vous pouvez maintenant compléter un nom via un appui sur la touche Tabulation, comme sous Linux. Attention, la commande complète le nom de la table, de la colonne ou de la fonction MAIS les propositions s'affichent au dessus de la ligne, pas en dessous comme sur Linux. Ici j'ai fais tab pour avoir les propositions après RE; bien sur, seuls s'affichent les objets auxquels le user a accès.
Exemple : 
     REGIONS REMOTE_SCHEDULER_AGENT.

     SQL> select count(*) from RE


============================================================================================
La commande ALIAS
============================================================================================

La commande ALIAS permet de créer un alias, comme sous Linux, pour une commande SQL.
L'aide SQLcl.
     SQL> help alias

     ALIAS
     ------

     alias [<name>=<SQL statement>;| LOAD [<filename>]|SAVE [<filename>] | LIST [<NAME>] |
     DROP <name> | DESC <name> <Description String>]

     Alias is a command which allows you to save a sql, plsql or sqlplus script and assign it a shortcut command.
     "alias" - print a list of aliases
     "alias list <aliasName>" - list the contents of the alias
     "alias <aliasName>=select :one from dual;" - Simple alias command
     Define an alias simply by using the alias keyword followed by a single identifier
     name followed by an '='. Anything after the '=' will be used as the alias contents.
     For example, if it is SQL, it will be terminated by a ';'. If it is PLSQL, it will
     be terminated by a '/'

     Examples:
     --------
     1. SQL Example with Binds

     SQL> alias fred=select :one from dual;
     In this example, a bind variable can be set up in the alias.
     Running the alias is done like this below with any parameters
     to the alias being bound to a bind variable by SQLcl

     SQL> fred 1
     Command=fred
     :ONE
     ----
     >

     2. PL/SQL example
     SQL> alias db= begin dbms_output.put_line('hi'); end;
     > /
     Here the block of PLSQL is terminated by the '/' on a separate
     line at which point it is accepted as a new alias.

     SQL> db
     Command=db
     PL/SQL procedure successfully completed.
     hi

     Summary
     -------
     alias ..=.. is terminated by ';'
     alias ..=begin or ..=declare is terminated by a / on a newline
     alias on its own gives a list of existing aliases.

A noter qu'avec la commande alias list nom_alias, on affiche la description de l'alias.
     SQL> alias test=select count(*) from employees;

     SQL> test
     COUNT(*)
     ----------
     107

     SQL> alias list test
     test
     ----
     select count(*) from employees

L'alias peut bien sur être supprimé.
     SQL> alias drop test
     Alias test dropped

     SQL> test
     SP2-0042: unknown command "test" - rest of line ignored.


============================================================================================
La commande REPEAT
============================================================================================
La commande REPEAT permet de lancer N fois, à un intervalle en secondes, la commande stockée dans le buffer.
L'aide de SQLcl.
     SQL> help repeat
     repeat <iterations> <sleep>
     Repeats the current sql in the buffer the specified times with sleep intervals
     Maximum sleep is 120s

A noter que SQLcl fait un saut d'écran à chaque itération, ce qui fait croire que le REPEAT ne marche pas sauf si on a bien noté le libellé "Running 1 of 3" qui s'incrémente. Pour des raisons de lisibilité, je mets à la suite le résultat de mon test. 
     SQL> select count(*) from dual;
     COUNT(*)
     ----------
     1

Le test est de répéter 3 fois, chaque seconde, la commande stockée dans le buffer; on ne peut pas dire quelle commande traiter, c'est obligatoirement la dernière.
     SQL> repeat 3 1
     Running 1 of 3 @ 0:49:19.492 with a delay of 1s
     COUNT(*)
     ___________
     1

     Running 2 of 3 @ 0:49:20.494 with a delay of 1s
     COUNT(*)
     ___________
     1

     Running 3 of 3 @ 0:49:21.496 with a delay of 1s
     COUNT(*)
     ___________
     1

Publicité
Publicité
Commentaires
Blog d'un DBA sur le SGBD Oracle et SQL
Publicité
Archives
Blog d'un DBA sur le SGBD Oracle et SQL
  • Blog d'un administrateur de bases de données Oracle sur le SGBD Oracle et sur les langages SQL et PL/SQL. Mon objectif est de vous faire découvrir des subtilités de ce logiciel, des astuces, voir même des surprises :-)
  • Accueil du blog
  • Créer un blog avec CanalBlog
Visiteurs
Depuis la création 340 769
Publicité