#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 /
Есть ли какие-либо способы, которыми мы могли бы решить эту проблему? Спасибо