如果你可以創建表/程序,這可能是一個辦法。 假設我們有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>
這就是shell腳本可能有用的地方。 – mustaccio
如果這是你的模式遷移,你可能想看看像Liquibase或Flyway這樣的工具,它們可以爲你做所有的事情 –