ANT Задача sql: Как запустить SQL и PL/SQL и выполнить сбой выполнения?

для выполнения файла .sql script из ANT он отлично работает, используя следующую задачу:

<sql
    classpath="${oracle.jar}" driver="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@@@{db.hostname}:@{db.port}:@{db.sid}" 
    userid="@{db.user}" 
    password="@{db.password}"
    src="@{db.sql.script}" />

Но если файл .sql не только содержит чистый SQL, но также PL/SQL, задача будет терпеть неудачу. Это можно решить, используя следующий фрагмент:

<sql
    classpath="${oracle.jar}" driver="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@@@{db.hostname}:@{db.port}:@{db.sid}" 
    userid="@{db.user}" 
    password="@{db.password}"
    delimiter="/"
    delimitertype="row"
    src="@{db.sql.script}" />

Но если мой script содержит как SQL , так и PL/SQL, то ни одна из задач ANT не будет работать. Другим решением было бы использовать задачу "exec" с "sqlplus":

<exec executable="sqlplus" failonerror="true" errorproperty="exit.status">
    <arg value="${db.user}/${db.password}@${db.hostname}:${db.port}/${db.sid}"/>
    <arg value="@${db.sql.script}"/>
</exec>

Но, к сожалению, эта задача никогда не сработает, поэтому сборка всегда возвращается с "SUCCESSFUL", хотя выполнение sql script завершилось с ошибкой. Свойство error, которое я пытался установить, не будет возвращать код ошибки.

Любые идеи/предложения по решению этой проблемы?

Спасибо,

Петр

Ответы

Ответ 1

Питер,

Добавить в начале скриптов

  WHENEVER SQLERROR EXIT SQL.CODE;

Затем sqlplus выйдет с кодом выхода!= 0.

Ответ 2

Довольно поздно, я думаю - но я надеюсь, что это поможет кому-то:

В общем, я думаю, что мы должны перенести с использованием sql, а не exec executable = "sqlplus" по многим причинам, например: в случае, если мы меняем поставщика БД, вы не проводите reaources в новом процессе с sql, "STOPPING" будет работать в отличие от sqlplus.exe и т.д.

В любом случае, вот предложение о том, как позволить PL/SQL и SQL в том же script, чтобы он работал:

myScript.sql:


<copy todir="...">
  <fileset dir="...." includes="myScript.sql"/>
  <filterchain>
    <replaceregex byline="false" pattern=";" replace="{line.separator}/" flags="mg"/>
    <replaceregex byline="false" pattern="/[\s]*/" replace=";${line.separator}/"  flags="mg"/>
   </filterchain>
</copy>

то получим результат:   <sql delimeter="/" src="myScript.sql"/>

объяснений: Если у вас есть обычные команды sql:

drop table x;
select blah from blue where bli=blee;

Они будут преобразованы в:

drop table x
/
select blah from blue where bli=blee
/

что эквивалентно - и команда sql с метрикой "/" может обрабатывать их.

С другой стороны,

BEGIN
  blah
END;
/

будет преобразован в:

BEGIN
  blas
END/
/

и используя второе регулярное выражение, преобразованное обратно в

BEGIN
  blas
END;
/

Итак, все побеждают! Ура!

Удачи.