Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 重新运行脚本的脚本_Oracle_Sqlplus - Fatal编程技术网

Oracle 重新运行脚本的脚本

Oracle 重新运行脚本的脚本,oracle,sqlplus,Oracle,Sqlplus,在工作中,我在进行生产部署时使用了大量预先编写的脚本,因此我开始创建包含这些脚本的主脚本,这些脚本主要用于保存键入。我在每个脚本之间添加了“暂停”命令,这样如果出现错误,我就可以中断主脚本并修复问题。此时,我必须编辑主脚本并删除已经运行的内容,以便在再次启动主脚本之前不会重新运行。我知道sqlplus中没有goto命令,但是有没有任何方法可以编写一个SQL脚本,从本质上讲,它可以恢复到停止的地方呢 为了清楚起见,主脚本如下所示: @script1.sql 暂停脚本1已完成。按回车键继续 @sc

在工作中,我在进行生产部署时使用了大量预先编写的脚本,因此我开始创建包含这些脚本的主脚本,这些脚本主要用于保存键入。我在每个脚本之间添加了“暂停”命令,这样如果出现错误,我就可以中断主脚本并修复问题。此时,我必须编辑主脚本并删除已经运行的内容,以便在再次启动主脚本之前不会重新运行。我知道sqlplus中没有goto命令,但是有没有任何方法可以编写一个SQL脚本,从本质上讲,它可以恢复到停止的地方呢

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

@script1.sql
暂停脚本1已完成。按回车键继续

@script2.sql
   .
   .
   .
暂停脚本2已完成。按回车键继续

@script2.sql
   .
   .
   .

如果您可以创建表/过程,这可能是一种方法。 假设我们有3个脚本要运行:

script1.sql:

create table table_script_1(id number);
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

create ta_ERROR_HERE_!!!!!!_ble table_script_2(id number);
create table table_script_3(id number);
script3.sql

create ta_ERROR_HERE_!!!!!!_ble table_script_2(id number);
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;
此时,我们的主脚本只需读取表,运行尚未执行的第一个脚本,然后递归调用自己,以运行下一个脚本:

main\u script.sql:

create table table_script_1(id number);
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>

这就是shell脚本可能有用的地方。如果这是用于模式迁移的,您可能想看看像Liquibase或Flyway这样的工具,它们可以为您完成所有这些