SQL générant du SQL

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.




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories