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