Задача ANT sql: Как запустить SQL и PL / SQL и заметить сбой выполнения? - PullRequest
15 голосов
/ 29 июля 2010

для выполнения файла сценария .sql из 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}" />

Но если мой скрипт содержит и 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 завершилось неудачно. Свойство error, которое я пытался установить, не вернет код ошибки.

Есть идеи / предложения, как решить эту проблему?

Спасибо

Peter

Ответы [ 2 ]

6 голосов
/ 16 марта 2012

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

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

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

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;
/

Так что все выигрывают! Ура!

Удачи.

6 голосов
/ 29 июля 2010

Питер,

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

  WHENEVER SQLERROR EXIT SQL.CODE;

Затем sqlplus завершит работу с кодом выхода! = 0.

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