Hvis du kan sætte denne kontrollerende sektion ind i sit eget script, f.eks. elcm_ctl.sql
, du kunne gøre det:
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
accepterer
kommando
er en smule pænere end at stole på substitutionsprompter, efter min mening, og er noget selvdokumenterende. Dette beder brugeren om den angivne streng i stedet for kun 'gen'
. (I SQL*Plus kan du udvide dette og tvinge brugeren til at indsætte et enkelt tegn, og spørge igen, hvis de sætter noget længere ind; og standard til 'N', hvis de bare trykker på retur uden at indtaste noget. Men SQL Developer understøtter kun en delmængde af funktionaliteten).
Så kaster en lille anonym blok en undtagelse - er lige meget hvilken - hvis den indtastede variabelværdi ikke er 'y'
eller 'Y'
. Mens den gør det, har jeg indstillet termin fra
så du kan ikke se den egentlige undtagelse. Og jeg har brugt whenever sqlerror
at få scriptet til at afslutte, når den undtagelse er rejst, så det, der kommer senere, ikke køres. Det er alt andet i kontrolscriptet, ikke kun den næste forespørgsel, men du kunne have flere underscripts, hvis du skulle være mere fleksibel.
Men i SQL Developer, termout
virker kun som forventet, når du kører via @
. Hvis du kører indholdet af elcm_ctl.sql
direkte fra SQL-regnearket vil du se undtagelsen blive rejst, hvilket er lidt grimt. Så gem i stedet det kontrolscript, og gør bare:
@c:\elcm_ctl.sql
Udfør det regneark som et script, og det vil bede dig om; hvis du indtaster 'Y'
du vil se outputtet af scriptet i script-outputvinduet (medmindre du forlader set termout fra
i kontrolscriptet), og det vil oprette spoolfilen. Hvis du indtaster noget andet, vil det ikke køre elcm.sql
fil, vil ikke vise noget i script-outputvinduet og vil ikke oprette en spool-fil.