2016-02-06 116 views
3

在工作中,我在生產部署時使用了大量預先編寫的腳本,因此我開始創建包含我使用的這些腳本的主腳本,主要是爲了節省打字。我在每個腳本之間添加「暫停」命令,所以如果出現錯誤,我可以跳出主腳本並解決問題。此時,我必須編輯主腳本並刪除已經運行的內容,以便在我能夠再次啓動主腳本之前不會重新運行。我知道在sqlplus中沒有goto命令,但是有沒有什麼方法可以編寫一個基本上能夠停止的SQL腳本?重新運行腳本腳本

只是爲了清楚起見,主腳本是這樣的:

@script1.sql 

暫停腳本1完成。打輸入繼續

@script2.sql 

暫停腳本2完成。打輸入繼續

. 
    . 
    . 
+0

這就是shell腳本可能有用的地方。 – 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跑OK,SCRIPT2有誤差3,和script3從不跑了。

修復script2.sql後,我們再次運行主腳本,而不修改它;在第二次運行中,主腳本只執行script2和script3,而不執行script1。 最終結果:

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>