2016-02-06 3 views
3

На работе я использую много предварительно написанных сценариев при выполнении производственных развертываний, поэтому я начал создавать мастер-скрипты, содержащие эти сценарии, которые я использую, в основном для сохранения ввода. Я добавляю команды «пауза» между каждым скриптом, поэтому, если есть ошибка, я могу выйти из главного скрипта и исправить проблему. В этот момент я должен отредактировать мастер-скрипт и удалить то, что уже было выполнено, чтобы он не запускался повторно, прежде чем я снова смогу запустить мастер-скрипт. Я знаю, что в sqlplus нет команды goto, но есть ли способ написать SQL-скрипт, который может существенно подобрать, где он остановился?Перезапуск сценария сценариев

Просто для ясности, мастер сценарий выглядит следующим образом:

@script1.sql 

пауза Сценарий 1 завершен. Хит Введите продолжить

@script2.sql 

пауза Сценарий 2 завершен. Хит Введите продолжить

. 
    . 
    . 
+0

Здесь может быть полезен сценарий оболочки. – mustaccio

+0

Если это связано с миграцией схемы, вы можете захотеть взглянуть на такие инструменты, как Liquibase или Flyway, которые могут сделать все, что для вас –

ответ

0

Если вы можете создать таблицы/процедуры, это может быть подход. Скажем, у нас есть 3 скрипты для запуска:

script1.sql:

create table table_script_1(id number); 

script2.sql

create ta_ERROR_HERE_!!!!!!_ble table_script_2(id number); 

script3.sql

create table table_script_3(id number); 

Мы можем создать таблицу, в которой мы будем хранить скрипты для запуска, в порядке исполнения, и процедура обработки этой таблицы:

create table script_to_run (num number, script varchar2(256), status varchar2(10)); 

create or replace procedure update_script (p_script varchar2, p_status varchar2) is 
pragma autonomous_transaction; 
begin 
    update script_to_run 
    set status = p_status 
    where script = p_script; 
    commit; 
end; 
/

Таким образом, мы используем таблицу, чтобы сказать, что сценарий, который мы имеем бежать, и в каком порядке:

insert into script_to_run values (1, 'd:\script1.sql', 'TO_RUN'); 
insert into script_to_run values (2, 'd:\script2.sql', 'TO_RUN'); 
insert into script_to_run values (3, 'd:\script3.sql', 'TO_RUN'); 
commit; 

на данный момент наш основной сценарий будет просто читать таблицу, запустить первый сценарий еще не выполняется, а затем называть себя рекурсивно, чтобы выполнить следующий скрипт:

ma in_script.sql:

column script new_val script 
WHENEVER SQLERROR EXIT 
select script 
from script_to_run 
where num = ( select min(num) 
       from script_to_run 
       where nvl(status, 'KO') != 'OK'); 
start &script 
exec update_script('&script', 'OK'); 
prompt 'Script &script OK' 
start d:\main_script.sql 

Теперь мы запускаем основной сценарий (в то время как script2.sql содержит ошибки) и проверьте результат:

SQL> select 1 from table_script_1; 

no rows selected 

SQL> select 1 from table_script_2; 
select 1 from table_script_2 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> select 1 from table_script_3; 
select 1 from table_script_3 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 
SQL> select * from script_to_run; 

     NUM SCRIPT            STATUS 
---------- -------------------------------------------------- ---------- 
     1 d:\script1.sql          OK 
     2 d:\script2.sql          TO_RUN 
     3 d:\script3.sql          TO_RUN 

Только script1 побежал ОК, Скрипт2 был error3 и Script3 никогда побежал.

После исправления скрипта2.sql мы снова запускаем основной скрипт, не изменяя его; во втором запуске основной скрипт исполняет скрипт2 и скрипт3, а не скрипт1. Окончательный результат:

SQL> select 1 from table_script_2; 

no rows selected 

SQL> select 1 from table_script_3; 

no rows selected 

SQL> select * from script_to_run; 

     NUM SCRIPT            STATUS 
---------- -------------------------------------------------- ---------- 
     1 d:\script1.sql          OK 
     2 d:\script2.sql          OK 
     3 d:\script3.sql          OK 

SQL> 
Смежные вопросы