Lors de créations génériques sur un ensemble d'objets d'un user par exemple, il est généralement utile de générer les scripts SQL dans un premier temps pour les exécuter dans un second.
Pour celà, sqlplus présente une option très intéressante : SPOOL qui permet de renvoyer le flux de sortie de SQL*plus vers un fichier.
L'idée est donc d'envoyer vers un fichier spoolé, le contenu d'ordres SQL issus d'une première requête.
Voici par exemple un script de reconstruction des index en mettant à jours ses statistiques et en parallélisant les process :
reconstruit_index.ksh :#!/bin/ksh
sqlplus '$UBDD/$PBDD' << +EOSQL+
spool all_rebuildindex.sql
start recup_all_rebuildindex.sql
+EOSQL+
sed 1,1d all_rebuildindex.sql > all_rebuildindex2.sql
split -l 25 all_rebuildindex2.sql index_en_morceau.sql.a
for i in `ls -1 index_en_morceau.sql.a*`
do
nohup sqlplus '$UBDD/$PBDD' @${i} &
done
rm index_en_morceau.sql.a*
rm all_rebuildindex.sql all_rebuildindex2.sql
tail -f nohup.out
recup_all_rebuildindex.sql :
SET ECHO OFF
SET NEWPAGE 0
SET SPACE 0
SET PAGESIZE 0
SET FEEDBACK OFF
SET HEADING OFF
SET TRIMSPOOL ON
select 'rebuild '|| index_name || ' compute statistics;' from user_indexes where last_analyzed < sysdate-5 or last_analyzed is null;
quit
Il suffit alors de lancer le script reconstruit_index.ksh sans oublier de positionner les variables : ORACLE_SID, UBDD, PBDD.
Concernant la commande spool de SQL*plus très pratique pour ce genre d'opérations, notons l'apparition de l'option append avec la 10g afin d'envoyer le résultat des ordres SQL à la suite d'un fichier existant :spool monscriptexistant.sql append
Voir aussi les scripts de désactivation de contraintes et d'index avant import et les statistiques Oracle.
SQL générant du SQL
Catégories
- bases (11)
- fonction (8)
- index (12)
- jointure (10)
- maintenance (5)
- migration (9)
- optimisation (17)
- paramétrage (7)
- PL_SQL (15)
- script SQL (11)
- sqlplus (5)
- tablespace (4)
- techniques (17)
- vue (5)
