Jeśli możesz umieścić tę sekcję kontrolującą w jej własnym skrypcie, np. elcm_ctl.sql
, możesz to zrobić:
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
polecenie
moim zdaniem jest trochę schludniejsze niż poleganie na podpowiedziach zastępowania i jest nieco samodokumentujące. To monituje użytkownika o określony ciąg, a nie tylko 'gen'
. (W SQL*Plus możesz rozszerzyć to i zmusić użytkownika do wpisania pojedynczego znaku, ponownie pytając, jeśli wprowadzi coś dłuższego; i domyślnie na 'N', jeśli po prostu naciśnie return bez wprowadzania czegokolwiek. Ale SQL Developer obsługuje tylko podzbiór funkcjonalności).
Następnie mały anonimowy blok zgłasza wyjątek — nie ma znaczenia który — jeśli wprowadzona wartość zmiennej nie jest 'y'
lub 'Y'
. Podczas gdy to robi, ustawiłem set termout off
więc nie widzisz faktycznego wyjątku. I używałem whenever sqlerror
aby skrypt zakończył działanie, gdy zostanie zgłoszony ten wyjątek, więc cokolwiek nadejdzie później, nie zostanie uruchomione. To wszystko inne w skrypcie sterującym, nie tylko następne zapytanie, ale możesz mieć kilka skryptów podrzędnych, jeśli potrzebujesz większej elastyczności.
Ale w SQL Developer, termout
działa tylko zgodnie z oczekiwaniami, gdy uruchamiasz przez @
. Jeśli uruchomisz zawartość elcm_ctl.sql
bezpośrednio z arkusza SQL zobaczysz wyjątek, który jest nieco brzydki. Więc zamiast tego zapisz ten skrypt sterujący i w pustym arkuszu po prostu wykonaj:
@c:\elcm_ctl.sql
Uruchom ten arkusz jako skrypt, a wyświetli się monit; jeśli wpiszesz 'Y'
zobaczysz wyjście skryptu w oknie wyjścia skryptu (chyba że zostawisz set termout off
w skrypcie sterującym) i utworzy plik buforowy. Jeśli wpiszesz cokolwiek innego, nie uruchomi elcm.sql
pliku, nie pokaże niczego w oknie wyjściowym skryptu i nie utworzy pliku buforowania.