Als u deze controlerende sectie in zijn eigen script kunt plaatsen, b.v. elcm_ctl.sql
, zou je dat kunnen maken:
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
De accepteren
commando
is naar mijn mening een beetje netter dan te vertrouwen op vervangingsprompts en is enigszins zelfdocumenterend. Dit vraagt de gebruiker om de gespecificeerde string, in plaats van alleen 'gen'
. (In SQL*Plus kun je dit uitbreiden en de gebruiker dwingen een enkel teken in te voeren, opnieuw vragen als ze iets langer invoeren; en standaard 'N' als ze gewoon op return drukken zonder iets in te voeren. Maar SQL Developer ondersteunt alleen een subset van de functionaliteit).
Dan genereert een klein anoniem blok een uitzondering - maakt niet echt uit welke - als de ingevoerde variabelewaarde niet 'y'
is of 'J'
. Terwijl het dat doet, heb ik ingesteld termout uit
zodat u de werkelijke uitzondering niet ziet. En ik heb wanneer sqlerror
om het script te laten afsluiten wanneer die uitzondering wordt gegenereerd, zodat wat later komt, niet wordt uitgevoerd. Dat is al het andere in het besturingsscript, niet alleen de volgende query, maar u kunt meerdere subscripts hebben als u flexibeler wilt zijn.
Maar in SQL Developer, termout
werkt alleen zoals verwacht als je via @
. draait . Als u de inhoud van elcm_ctl.sql
. uitvoert rechtstreeks vanuit het SQL-werkblad zie je dat de uitzondering wordt opgeworpen, wat een beetje lelijk is. Dus sla in plaats daarvan dat besturingsscript op en doe in een leeg werkblad gewoon:
@c:\elcm_ctl.sql
Voer dat werkblad uit als een script en het zal u vragen; als u 'Y'
. invoert u ziet de uitvoer van het script in het uitvoervenster van het script (tenzij u set termout uitgeschakeld
laat staan in het besturingsscript), en het zal het spoolbestand maken. Als u iets anders invoert, wordt de elcm.sql
. niet uitgevoerd bestand, toont niets in het scriptuitvoervenster en maakt geen spoolbestand.