Как автоматически откатиться, если скрипт имеет ошибку в Oracle sql plus - PullRequest
0 голосов
/ 26 сентября 2019

Мне нужно выполнить несколько скриптов, имеющих один главный файл sql.Всякий раз, когда я использовал для выполнения мастер-сценарий вызова с именем calling_test.sql, если возникает какая-либо ошибка, необходимо откатываться.

sqlplus USERNAME/PWD@SIR_NAME;
@@calling_test.sql

- это содержимое calling_test.sql сценария.

SET echo ON; 
SET define ON; 
SET scan ON; 
define PATH =/krishna/test 
define AB_SCHEMA=AIM 
spool Test_incremental.log 
SET define ON; 
@@&&PATH/AUG/2019-08-28/test1.sql
SET define ON; 
@@&&PATH/AUG/2019-08-29/test2.sql 
SET define ON; 
@@&&PATH /AUG/2019-08-30/test3.sql 
SET define ON; 

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Скрипт должен содержать что-то вроде этого:

whenever sqlerror exit rollback

Пример:

SQL> create table test (col number);

Table created.

SQL>

SQL-скрипт (с именем p.sql)

whenever sqlerror exit rollback

insert into test values (100);
insert into test values ('A');

Вызов его:

M:\>sqlplus scott/tiger@orcl @p.sql

SQL*Plus: Release 11.2.0.1.0 Production on ╚et Ruj 26 13:38:50 2019

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options


1 row created.

insert into test values ('A')
                         *
ERROR at line 1:
ORA-01722: invalid number


Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

M:\>

Результат:

SQL> select * From test;

no rows selected

SQL>
0 голосов
/ 28 сентября 2019

Вы можете откатить действия из вызываемых скриптов, но в дополнение к команде WHENEVER вы также должны установить SET AUTOCOMMIT OFF.Обычно, когда Sqlplus выходит из скрипта, который вызывается в отдельном файле, он фиксирует.Однако предшествующее отменяет это действие.Смотрите ниже: (сохраните каждый скрипт в указанном файле.)

   ----------------------------------------------------------------------------           -- script mst_0.sql
    create table multi_script_test( id integer, description varchar2(50));
    insert into multi_script_test values( 0, 'Initial before script.');
    commit;

    -- script mst_1.sql
    insert into multi_script_test values( 1, 'Insert from script mst_1');

    -- script mst_2.sql
    insert into multi_script_test values ( 2, 'Insert from script mst_2');

    -- script mst_3.sql
    insert into multi_script_test values ( 3/0, 'oops');

    -- script mst_4.sql
    insert into multi_script_test values ( 4, 'Insert from script mst_4');

    -- main script mst_main.sql
    set echo on
    set autocommit off
    whenever sqlerror continue rollback

    @@c:/so/ora/mst_0.sql
    @@c:/so/ora/mst_1.sql
    @@c:/so/ora/mst_2.sql
    -- following should display rows 0, 1, 2
    select * from multi_script_test;

    -- generate error and due to whenever directive 'rollback' discard rows 1,2
    @c:/so/ora/mst_3.sql

    -- continue script processing, also due to whenever directive 'contunue'
    @c:/so/ora/mst_4.sql
    commit;
    ----------------------------------------------------------------------------

    sqlplus -- complete the signon 

    -- run main script 
    @mst_main


    -- following show show display 0, 4
    select * from multi_script_test;

    exit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...