Oracle
 sql >> Base de données >  >> RDS >> Oracle

Génération de spool basée sur les conditions dans le script Oracle SQL

Si vous pouvez mettre cette section de contrôle dans son propre script, par ex. elcm_ctl.sql , vous pourriez faire ça :

accept run_it char format a1 prompt "Run the script?"

set termout off

whenever sqlerror exit success rollback
exec if upper(nvl('&run_it', 'N')) != 'Y' then raise no_data_needed; end if;
whenever sqlerror continue

spool c:\elcm.sql
select 'select sysdate from dual;' from dual;
spool off

set termout on

spool c:\elcm_details.spl
@c:\elcm.sql
spool off

Le accept commande est un peu plus propre que de s'appuyer sur des invites de substitution, à mon avis, et est quelque peu auto-documenté. Cela invite l'utilisateur avec la chaîne spécifiée, plutôt que simplement 'gen' . (Dans SQL * Plus, vous pouvez étendre cela et forcer l'utilisateur à insérer un seul caractère, en le redemandant s'il ajoute quelque chose de plus; et par défaut à 'N' s'il appuie simplement sur retour sans rien entrer. Mais SQL Developer ne prend en charge que un sous-ensemble de la fonctionnalité).

Ensuite, un petit bloc anonyme lève une exception - peu importe laquelle - si la valeur de la variable saisie n'est pas 'y' ou 'Y' . Pendant ce temps, j'ai set termout off donc vous ne voyez pas l'exception réelle. Et j'ai utilisé whenever sqlerror pour que le script se termine lorsque cette exception est déclenchée, donc tout ce qui vient plus tard n'est pas exécuté. C'est tout le reste dans le script de contrôle, pas seulement la requête suivante, mais vous pouvez avoir plusieurs sous-scripts si vous avez besoin d'être plus flexible.

Mais dans SQL Developer, termout ne fonctionne comme prévu que lorsque vous exécutez via @ . Si vous exécutez le contenu de elcm_ctl.sql directement à partir de la feuille de calcul SQL, vous verrez l'exception être déclenchée, ce qui est un peu moche. Donc, à la place, enregistrez ce script de contrôle et dans une feuille de calcul vide, faites simplement :

@c:\elcm_ctl.sql

Exécutez cette feuille de calcul en tant que script et vous y serez invité ; si vous saisissez 'Y' vous verrez la sortie du script dans la fenêtre de sortie du script (sauf si vous laissez set termout off dans le script de contrôle), et il créera le fichier spool. Si vous entrez autre chose, il n'exécutera pas le elcm.sql fichier, n'affichera rien dans la fenêtre de sortie du script et ne créera pas de fichier spoule.