Ответ 1
Питер,
Добавить в начале скриптов
WHENEVER SQLERROR EXIT SQL.CODE;
Затем sqlplus выйдет с кодом выхода!= 0.
для выполнения файла .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, которое я пытался установить, не будет возвращать код ошибки.
Любые идеи/предложения по решению этой проблемы?
Спасибо,
Петр
Питер,
Добавить в начале скриптов
WHENEVER SQLERROR EXIT SQL.CODE;
Затем sqlplus выйдет с кодом выхода!= 0.
Довольно поздно, я думаю - но я надеюсь, что это поможет кому-то:
В общем, я думаю, что мы должны перенести с использованием 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;
/
Итак, все побеждают! Ура!
Удачи.