Pokud můžete tuto ovládací sekci vložit do vlastního skriptu, např. elcm_ctl.sql , můžete to udělat:
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
accept příkaz
je podle mého názoru o něco úhlednější než spoléhání na substituční výzvy a je poněkud samodokumentující. Tím se uživateli vyzve zadaný řetězec, nikoli pouze 'gen' . (V SQL*Plus to můžete rozšířit a donutit uživatele, aby vložil jeden znak, znovu se zobrazí výzva, pokud vloží něco delšího; a výchozí na 'N', pokud pouze stiskne návrat bez zadávání čehokoli. Ale SQL Developer podporuje pouze podmnožinu funkcí).
Potom malý anonymní blok vyvolá výjimku - nezáleží na tom, která z nich - pokud zadaná hodnota proměnné není 'y' nebo 'Y' . Zatímco to dělá, nastavil jsem set termout off
takže skutečnou výjimku nevidíte. A použil jsem whenever sqlerror
aby se skript ukončil, když je tato výjimka vyvolána, takže cokoli přijde později, nebude spuštěno. To je vše ostatní v řídicím skriptu, nejen další dotaz, ale pokud potřebujete být flexibilnější, můžete mít několik dílčích skriptů.
Ale v SQL Developer, termout funguje podle očekávání pouze při spuštění přes @ . Pokud spustíte obsah elcm_ctl.sql přímo z listu SQL uvidíte výjimku vyvolanou, což je trochu ošklivé. Takže místo toho uložte řídicí skript a v prázdném listu proveďte:
@c:\elcm_ctl.sql
Spusťte tento list jako skript a zobrazí se výzva; pokud zadáte 'Y' výstup skriptu uvidíte v okně výstupu skriptu (pokud nenecháte set termout off v řídicím skriptu) a vytvoří soubor pro souběžný tisk. Pokud zadáte cokoliv jiného, nespustí elcm.sql soubor, nezobrazí nic v okně výstupu skriptu a nevytvoří soubor pro souběžný tisk.