gpt4 book ai didi

oracle - 重新运行脚本的脚本

转载 作者:行者123 更新时间:2023-12-02 11:48:23 26 4
gpt4 key购买 nike

在工作中,我在进行生产部署时使用了大量预先编写的脚本,因此我开始创建包含我使用的这些脚本的主脚本,主要是为了节省打字。我在每个脚本之间添加“暂停”命令,这样如果出现错误,我可以突破主脚本并修复问题。此时,我必须编辑主脚本并删除已运行的内容,以便在再次启动主脚本之前它不会重新运行。我知道 sqlplus 中没有 goto 命令,但是有没有办法编写一个 SQL 脚本,基本上可以从中断处继续执行?

为了清楚起见,主脚本如下所示:

@script1.sql

暂停脚本 1 已完成。按Enter继续

@script2.sql

暂停脚本 2 已完成。按Enter继续

   .
.
.

最佳答案

如果您可以创建表/过程,这可能是一种方法。假设我们有 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 运行正常,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>

关于oracle - 重新运行脚本的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35242190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com