Генерация спула на основе условий в сценарии Oracle SQL

У меня есть сценарий, в котором мы генерируем катушку на основе условия.

Буфер должен генерироваться, только если пользователь вводит y.

column col noprint new_value elcm_script
select decode(lower('&gen'),'y','C:\ELCM.SQL','n', 'null') col from dual;

SPOOL c:\ELCM_DETAILS.SPL 
@&elcm_script
spool off

В приведенном выше примере он будет генерировать файл спула, даже если пользователь введет n, например файл чтения ошибок. Как остановить создание спула, если n.or как удалить спул, который сгенерирован/


person user3737084    schedule 27.06.2014    source источник
comment
Вы могли бы поместить команду SPOOL в скрипт ELCM.SQL?   -  person Tony Andrews    schedule 27.06.2014
comment
Просто чтобы уточнить, вы вообще не хотите запускать скрипт; дело не только в том, что вы хотите запустить его, а не в буфере вывода в файл?   -  person Alex Poole    schedule 27.06.2014
comment
Я не хочу создавать катушку, если пользователь не введет «y».   -  person user3737084    schedule 27.06.2014
comment
На самом деле это не ответило на мой вопрос, но я предполагаю, что вы не хотите запускать скрипт на основе текущего декодирования. Это выполняется через SQL * Plus?   -  person Alex Poole    schedule 27.06.2014
comment
Он запускается через разработчика sql   -  person user3737084    schedule 27.06.2014
comment
Да, Алекс, я не хочу, чтобы скрипт запускался.   -  person user3737084    schedule 27.06.2014


Ответы (1)


Если вы можете поместить этот управляющий раздел в свой собственный сценарий, например. elcm_ctl.sql, можно сделать так:

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 немного лучше, чем полагаться на подстановку подсказывает, на мой взгляд, и несколько самодокументируется. Это запрашивает у пользователя указанную строку, а не просто 'gen'. (В SQL * Plus вы можете расширить это и заставить пользователя вводить один символ, повторно запрашивая, если они вводят что-то более длинное, и по умолчанию «N», если они просто нажимают клавишу возврата, ничего не вводя. Но SQL Developer поддерживает только часть функциональности).

Затем небольшой анонимный блок выдает исключение — неважно какое, — если введенное значение переменной не равно 'y' или 'Y'. Пока это происходит, я set termout off так вы не видите фактического исключения. И я использовал whenever sqlerror, чтобы заставить скрипт выйти когда возникает это исключение, поэтому все, что приходит позже, не запускается. Это все остальное в сценарии управления, а не только следующий запрос, но у вас может быть несколько подскриптов, если вам нужно быть более гибким.

Но в SQL Developer termout работает должным образом только при запуске через @. Если вы запустите содержимое elcm_ctl.sql непосредственно из рабочего листа SQL, вы увидите возбуждаемое исключение, что немного уродливо. Поэтому вместо этого сохраните этот управляющий скрипт и на пустом листе просто выполните:

@c:\elcm_ctl.sql

Выполните этот рабочий лист как сценарий, и он предложит вам; если вы введете 'Y', вы увидите выходные данные скрипта в окне вывода скрипта (если вы не оставите set termout off в управляющем скрипте), и будет создан файл спула. Если вы введете что-нибудь еще, он не запустит файл elcm.sql, ничего не покажет в окне вывода скрипта и не создаст буферный файл.

person Alex Poole    schedule 27.06.2014
comment
Идеальный Алекс.. У меня есть еще один вопрос. Я генерирую этот C:\ELCM.SQL в своем скрипте. Могу ли я это остановить? ? - person user3737084; 27.06.2014
comment
Вам не нужен decode, если вы это имеете в виду? То, что я показал, — это полный сценарий, который я запускал, чтобы проверить это. - person Alex Poole; 27.06.2014
comment
В моем сценарии. Я генерирую t C:\ELCM.SQL следующим образом. SPOOL c:\ELCM.SQL select 'выбрать sysdate из двойного; из двойного; вывести столбец столбца noprint новое_значение elcm_script выбрать декодировать(нижний('&gen'),'y','C:\ELCM.SQL','n', 'null') столбец из двойного; SPOOL c:\ELCM_DETAILS.SPL @&elcm_script spool off Я не хочу, чтобы .sql генерировался, если пользователь вводит n - person user3737084; 27.06.2014
comment
Если вы сгенерируете его после проверки exec, то он тоже будет пропущен, да. - person Alex Poole; 27.06.2014
comment
Вы хотите сказать, что всякий раз, когда откат успешного выхода из sqlerror устанавливает termout off exec, if upper(nvl('&run_it', 'N')) != 'Y', тогда ВСЕ МОИ операторы генерации .SQL вызывают no_data_needed; закончить, если; установить termout на всякий раз, когда sqlerror продолжить буферизацию c:\elcm_details.spl @c:\elcm.sql отключить катушку .. Это правильно? - person user3737084; 27.06.2014
comment
@user3737084 user3737084 - не уверен на 100%, что я следую, но я добавил то, что, как я думаю, вы имеете в виду, создав сценарий, который вы запускаете из сценария управления. - person Alex Poole; 27.06.2014