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.