Om du kan lägga in den här kontrollerande sektionen i ett eget skript, t.ex. elcm_ctl.sql
, du kan göra 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
accepterar
kommando
är lite snyggare än att förlita sig på substitutionsuppmaningar, enligt min mening, och är något självdokumenterande. Detta uppmanar användaren med den angivna strängen, snarare än bara 'gen'
. (I SQL*Plus kan du utöka detta och tvinga användaren att lägga in ett enstaka tecken, och fråga igen om de lägger in något längre; och standard till 'N' om de bara trycker på retur utan att ange något. Men SQL Developer stöder bara en delmängd av funktionaliteten).
Sedan kastar ett litet anonymt block ett undantag - spelar ingen roll vilket - om det angivna variabelvärdet inte är 'y'
eller 'Y'
. Medan det gör det har jag ställt in termin av
så du ser inte själva undantaget. Och jag har använt när sqlerror
för att få skriptet att avslutas när det undantaget höjs, så att det som kommer senare inte körs. Det är allt annat i kontrollskriptet, inte bara nästa fråga, utan du kan ha flera underskript om du behövde vara mer flexibel.
Men i SQL Developer, termout
fungerar bara som förväntat när du kör via @
. Om du kör innehållet i elcm_ctl.sql
direkt från SQL-arbetsbladet ser du att undantaget höjs, vilket är lite fult. Så istället spara det kontrollskriptet och i ett tomt kalkylblad gör bara:
@c:\elcm_ctl.sql
Kör det kalkylbladet som ett skript och det kommer att fråga dig; om du anger 'Y'
du kommer att se utdata från skriptet i skriptutdatafönstret (om du inte lämnar set termout off
i kontrollskriptet), och det skapar spoolfilen. Om du anger något annat kommer det inte att köra elcm.sql
fil, kommer inte att visa någonting i skriptutmatningsfönstret och kommer inte att skapa en spoolfil.