Как завершить сборку ANT, если какой-либо SQL не работает внутри цикла - PullRequest
0 голосов
/ 05 августа 2020

Мне нужно запустить все SQL файлы, имеющиеся в каталоге. Итак, используя для l oop, я могу добиться этого, но теперь сборка успешна, даже если какая-либо из SQL не удалась.

Как завершить сборку ANT, если она есть sql не выполнено в l oop?

build. xml

<?xml version="1.0"?>
<project name="run_build" default="full_build">

        <target name="init" description="Initialize the Ant variables">
                <taskdef resource="net/sf/antcontrib/antlib.xml"/>
        </target>

        <target name="run_sqls" depends="init" description="Run SQLs">
                <for param="sqlfile">
                        <path>
                                <fileset dir="." includes="*.sql"/>
                        </path>
                        <sequential>
                                <property name="sqlfilename" value="@{sqlfile}"/>
                                <echo message = "Running SQL file : ${sqlfilename} "/>
                                <exec executable="${ORACLE_HOME}/bin/sqlplus" failonerror="true">
                                  <arg value="dbuser/dbpass@dbinstance"/>
                                  <arg value="@${sqlfilename}"/>
                                </exec>
                        </sequential>
                </for>
        </target>

        <target name="full_build" description="Running full build">
          <antcall target="run_sqls"/>
        </target>

</project>

Current Output : сборка успешна, даже если sql не удалось.

Buildfile: build.xml

full_build:

init:

run_sqls:
     [echo] Running Schema SQL file : abc.sql
     [exec]
     [exec] SQL*Plus: Release 11.2.0.3.0 Production on Wed Aug 5 14:20:25 2020
     [exec]
     [exec] Copyright (c) 1982, 2011, Oracle.  All rights reserved.
     [exec]
     [exec]
     [exec] Connected to:
     [exec] Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
     [exec] With the Partitioning, OLAP, Data Mining and Real Application Testing options
     [exec]
     [exec] update table_sdj set first_name='FirstName' where id=123
     [exec]        *
     [exec] ERROR at line 1:
     [exec] ORA-00942: table or view does not exist
     [exec]
     [exec]
     [exec]
     [exec] Commit complete.
     [exec]
     [exec] SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
     [exec] With the Partitioning, OLAP, Data Mining and Real Application Testing options

BUILD SUCCESSFUL
Total time: 0 seconds

1 Ответ

1 голос
/ 05 августа 2020

Вы должны добавить эти предложения в свои сценарии sqlplus, чтобы контролировать, была ли ошибка sql или ошибка ОС.

whenever sqlerror exit failure;
whenever oserror exit failure;

Затем вы должны контролировать этот код возврата в своей программе, чтобы проверьте, нормально ли выполнен сценарий. Если вы этого не сделаете, sqlplus всегда завершает работу с 0, несмотря ни на что.

Пример

$ cat test.sql
set echo on
drop table tx purge;
exit;
$ sqlplus / as sysdba @test.sql

SQL*Plus: Release 12.2.0.1.0 Production on Wed Aug 5 12:11:31 2020

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> drop table tx purge;
drop table tx purge
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> exit;
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
$ echo $?
0

С включенными правыми предложениями

$ cat test.sql
whenever sqlerror exit failure;
whenever oserror exit failure;
set echo on
drop table tx purge;
exit;
$ sqlplus / as sysdba @test.sql

SQL*Plus: Release 12.2.0.1.0 Production on Wed Aug 5 12:13:26 2020

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> drop table tx purge;
drop table tx purge
           *
ERROR at line 1:
ORA-00942: table or view does not exist


Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
$ echo $?
1

По умолчанию, как показано , sqlplus всегда будет завершать работу с 0. Вам необходимо указать ему, что он будет выходить с ошибкой, когда произойдет ошибка.

всякий раз, когда sqlerror

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