Cet article est repris d’un ancien blog et fusionné avec un autre
SQLPlus est l’outil incontournable du DBA Oracle. Même si beaucoup n’utilisent que des interfaces graphiques, il arrive un moment ou un autre où il doit se connecter à une machine qui ne propose pas cette commodité et dès lors, l’outil basique, livré avec le moteur, devient un passage obligé voire incontournable ou presque.
Je liste ici quelques trucs, astuces, commandes qui permettent d’utiliser SQLPlus de manière sympathique et sans trop de prise de tête.
Se connecter à une base avec sqlplus
Si vous êtes sur le serveur ou se trouve la base
$ sqlplus [...] Entrez le nom utilisateur : <utilisateur>/<mot de passe> [...] SQL>
Si votre tnsnames.ora est renseigné
$ sqlplus [...] Entrez le nom utilisateur : <utilisateur>/<mot de passe>@<alias tns> [...] SQL>
Si votre tnsnames.ora n’est pas renseigné
$ sqlplus [...] Entrez le nom utilisateur : <utilisateur>/<mot de passe>@//<serveur>:<port>/<service> [...] SQL>
Voir les constantes définies
SQL> def DEFINE _DATE = "09/10/12" (CHAR) DEFINE _CONNECT_IDENTIFIER = "//127.0.0.1:1521/orcl" (CHAR) DEFINE _USER = "SCOTT" (CHAR) DEFINE _PRIVILEGE = "" (CHAR) DEFINE _SQLPLUS_RELEASE = "1102000300" (CHAR) DEFINE _EDITOR = "vi" (CHAR) DEFINE _O_VERSION = "Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options" (CHAR) DEFINE _O_RELEASE = "1102000300" (CHAR) DEFINE _RC = "1" (CHAR) SQL>
Utiliser les constantes
Constantes pré-existantes
SQL> select '&_EDITOR' from dual ; 'v -- vi SQL>
Constantes non existantes
Sans définition dynamique de la constante
SQL> select '&CNST' from dual ; Entrez une valeur pour cnst : TOTO 'TOT ---- TOTO SQL> define CNST SP2-0135: le symbole CNST est INDEFINI
Avec définition dynamique de la constante
SQ> select '&&CNST' from dual ; Entrez une valeur pour cnst : TITI 'TIT ---- TITI SQL> define CNST DEFINE CNST = "TITI" (CHAR)
Supprimer une constante
SQL> define CNST DEFINE CNST = "TITI" (CHAR) SQL> UNDEF CNST SQL> define CNST SP2-0135: le symbole CNST est INDEFINI
Utiliser un dépôt de scripts centralisé
SQL> def r=http://depot/scripts/sql SQL> @&r/cre_super_user.sql Utilisateur cree, compte verouille
On peut s’amuser à écrire les scripts dans un langage web comme PHP et donc protéger l’accès au scripts (plus ou moins).
Affecter et visualiser les variables de liaison (bind variables) définies dans la session
SQL> variable toto number SQL> exec :toto:=7 SQL> variable titi number SQL> exec :titi:=9 SQL> print TOTO ---------- 7 TITI ---------- 9
Sauvegarder et restaurer les settings avant de les modifier
Sauvegarder
SQL> store set settings_sqlplus replace
Restaurer
SQL> @settings_sqlplus
Créer un ficher de sortie propre
SQL> set ver off -- evite l'affichage des réécritures de constantes SQL> set lin 32767 -- taille maxi d'une ligne SQL> set trimspool on -- enlève les blancs en fin de ligne dans le fichier de sortie SQL> set pages 0 -- page de taille infinie mais sans titres par défaut SQL> set emb on -- affiche les titres une foi SQL> set newp none -- évite les sauts de pages SQL> set termout off -- évite la sortie sur écran, seul le fichier sera renseigné SQL> set echo off -- évite l'affichage des requêtes et donc leur écriture SQL> set feed off -- évite les infos de fin de requêtes (n lignes ...) SQL> set timi off -- évite le chronométrage en fin de requête SQL> set autot off -- évite la production d'un plan en fin de requête SQL> set long 9999999 -- permet l'affichage de longs de 9999999 octets SQL> set longc 9999999 -- permet l'affichage de longs de 9999999 caractères* SQL> clear computes -- supprime les agrégations automatiques de colonnes SQL> clear columns -- supprime les formatages de colonnes SQL> clear breaks -- supprime les sauts SQL> TTITLE off -- supprime les titres de haut de requête (ou de pages) SQL> BTITLE off -- supprime les titres de bas de requête SQL> REPHEADER off -- supprime les en-tête de rapports SQL> REPFOOTER off -- supprime les pieds de rapports SQL> spool <fichier de sortie> SQL> -- instructions SQL> spool off
Concatener des constantes
SQL> def NOM_FIC=monfic SQL> spool &&MON_FIC..txt SQL> -- instructions SQL> spool off
Impossible de se connecter mais analyse requise
$ sqlplus -prelim SQL*Plus: Release 11.2.0.3.0 Production on Mer. Oct. 10 08:36:15 2012 Copyright (c) 1982, 2011, Oracle. All rights reserved. Entrez le nom utilisateur : / as sysdba SQL>
Cette connexion est dite préliminaire et ne permet que d’utiliser oradebug ou de faire un shutdown abort
Voilà déjà de quoi s’amuser. Avec ces quelques infos/trucs vous pouvez administrer efficacement tout un parc de bases de données sans passer par des interfaces lourdes et (bien souvent) inutiles. Reste à connaitre le SQL et le catalogue Oracle mais après tout vous êtes DBA non ?
Un petit exercice pratique ? Créer un fichier CSV
La question revient souvent sur les forums : comment produire un fichier CSV depuis SQLPlus …
La solution a été donnée sur un forum, elle est copiée ici dans une version un peu remaniée et très légèrement plus générique
L’appel est simple depuis sqlplus: @sql2csv <nom du fichier contenant la(les) requête(s) à exporter en csv>
-- merci à skuatamad (http://www.developpez.net/forums/u253956/skuatamad/) -- -- 1 paramètre : le nom du script sql à exécuter -- En sortie un fichier CSV -- store set settings_sqlplus replace set echo off set feedback off set linesize 32767 set pages 0 emb on newp none set sqlprompt '' set trimspool on set long 9999999 set longc 9999999 set colsep ';' set heading on set recsep off set headsep on set underline off spool &&1..csv @&&1 spool off undef 1 @settings_sqlplus
Par exemple avec cette requête sql stockée dans le fichier sessions.sql :
select sid , serial# , process , sql_id , last_call_et , status from v$session ;
On obtient génère le fichier csv de la manière suivante:
SQL> @sessions SID SERIAL# PROCESS SQL_ID LAST_CALL_ET STATUS ---------- ---------- ------------ ------------- ------------ -------- 146 10 4312 4gd6b1r53yt88 60116 ACTIVE 151 2 4308 60116 ACTIVE 157 7 3836 60126 ACTIVE 159 46 6640:5200 g8730nuf9c1xf 0 ACTIVE 160 1 3796 60133 ACTIVE 161 1 3792 4gd6b1r53yt88 60133 ACTIVE 162 1 3788 60133 ACTIVE 163 1 3784 60133 ACTIVE 164 1 3780 60133 ACTIVE 165 1 3776 60133 ACTIVE 166 1 3772 60133 ACTIVE SID SERIAL# PROCESS SQL_ID LAST_CALL_ET STATUS ---------- ---------- ------------ ------------- ------------ -------- 167 1 3768 60133 ACTIVE 168 1 3764 60133 ACTIVE 169 1 3760 60133 ACTIVE 170 1 3756 60133 ACTIVE 15 rows selected. SQL> @sql2csv sessions Wrote file settings_sqlplus SID; SERIAL#;PROCESS ;SQL_ID ;LAST_CALL_ET;STATUS 146; 10;4312 ;4gd6b1r53yt88; 60140;ACTIVE 151; 2;4308 ; ; 60140;ACTIVE 157; 7;3836 ; ; 60150;ACTIVE 159; 46;6640:5200 ;g8730nuf9c1xf; 0;ACTIVE 160; 1;3796 ; ; 60157;ACTIVE 161; 1;3792 ;4gd6b1r53yt88; 60157;ACTIVE 162; 1;3788 ; ; 60157;ACTIVE 163; 1;3784 ; ; 60157;ACTIVE 164; 1;3780 ; ; 60157;ACTIVE 165; 1;3776 ; ; 60157;ACTIVE 166; 1;3772 ; ; 60157;ACTIVE 167; 1;3768 ; ; 60157;ACTIVE 168; 1;3764 ; ; 60157;ACTIVE 169; 1;3760 ; ; 60157;ACTIVE 170; 1;3756 ; ; 60157;ACTIVE SQL> ho type sessions.csv SID; SERIAL#;PROCESS ;SQL_ID ;LAST_CALL_ET;STATUS 146; 10;4312 ;4gd6b1r53yt88; 60140;ACTIVE 151; 2;4308 ; ; 60140;ACTIVE 157; 7;3836 ; ; 60150;ACTIVE 159; 46;6640:5200 ;g8730nuf9c1xf; 0;ACTIVE 160; 1;3796 ; ; 60157;ACTIVE 161; 1;3792 ;4gd6b1r53yt88; 60157;ACTIVE 162; 1;3788 ; ; 60157;ACTIVE 163; 1;3784 ; ; 60157;ACTIVE 164; 1;3780 ; ; 60157;ACTIVE 165; 1;3776 ; ; 60157;ACTIVE 166; 1;3772 ; ; 60157;ACTIVE 167; 1;3768 ; ; 60157;ACTIVE 168; 1;3764 ; ; 60157;ACTIVE 169; 1;3760 ; ; 60157;ACTIVE 170; 1;3756 ; ; 60157;ACTIVE