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

#sql #ant #plsql

#sql #ant #plsql

Вопрос:

чтобы выполнить файл сценария .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>
  

Но, к сожалению, эта задача никогда не завершится неудачей, следовательно, сборка всегда возвращается с «УСПЕШНЫМ», даже если выполнение sql-скрипта завершилось неудачей. Свойство error, которое я пытался установить, не возвращало никакого кода ошибки.

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

Спасибо,

Питер

Ответ №1:

Питер,

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

   WHENEVER SQLERROR EXIT SQL.CODE;
  

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

Ответ №2:

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

В общем, я думаю, нам следует лучше использовать sql, а не exec executable =»sqlplus» по многим причинам, таким как: в случае смены поставщика БД вы не тратите ресурсы на новый процесс с sql, «ОСТАНОВКА» будет работать в отличие от 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;
/
  

Итак, выигрывают все! Ура!

Удачи.

Комментарии:

1. Я попытался заменить точку с запятой косой чертой, и это работает нормально. Однако у меня есть несколько сценариев создания пакетов, которые у меня есть с точками с запятой. Если я заменю точку с запятой косой чертой, ant успешно выполнит сценарии sql, но все пакеты будут созданы с ошибками компиляции из-за ошибки Encountered symbol / Есть ли какие-либо способы, которыми мы могли бы решить эту проблему? Спасибо