2010-07-29 11 views
15

aşağıdaki görevini kullanarak çalışıyor ANT bir .sql komut dosyasını çalıştırmak için:ANT sql görevi: SQL ve PL/SQL nasıl çalıştırılır ve yürütme hatası nasıl bildirilir?

<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}" /> 

Ama .sql dosyası sadece saf SQL içeriyor ama eğer aynı zamanda PL/SQL görev başarısız olur. Bu aşağıdaki parçacığını kullanarak çözülebilir:

<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}" /> 

Ama benim senaryom içeriyor hem SQL ve PL/SQL eğer o zaman ne ANT görev çalışacaktır. Başka bir çözüm "SQLplus" ile "exec" görevi kullanmak olacaktır:

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

Ama

maalesef bu görevi başarısız asla dolayısıyla inşa sql komut dosyası yürütme başarısız olsa bile "BAŞARILI" ile her zaman döndürür. Ayarlamaya çalıştığım hata özelliği, herhangi bir hata kodunu döndürmez.

Bu sorunu nasıl çözebilirim?

sayesinde

Peter

cevap

6

Peter

!

WHENEVER SQLERROR EXIT SQL.CODE; 

Sonra SQLplus çıkış koduyla çıkılacak komut başında ekle = 0.

6

Pretty geç, sanırım - ama umarım bu yardımcı olur:

Genel olarak, sanırım sql'ı exec yürütülebilir = "sqlplus" yerine bir çok nedenden dolayı perdelemeliyiz, örneğin: DB sağlayıcısını değiştirmemiz durumunda, sql ile yeni bir işlemde kaynak harcamazsınız, "

myScript.sql:

Neyse vb

sqlplus.exe aksine çalışacak "olacak DURDURMA, işte çalışacak şekilde aynı komut PL/SQL & SQL hem izin için nasıl bir öneri


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

sonra sonuç vermek: <sql delimeter="/" src="myScript.sql"/>

explaination: Düzenli sql komutları varsa :

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

Onlar dönüştürülecektir: equivlant olan

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

- ve "/" sınırlayıcı ile sql komutu bunları işleyebilir.

BEGIN 
    blas 
END; 
/

geri dönüştürülmüş Yani herkes kazanacak -

BEGIN 
    blas 
END/ 
/

ve ikinci regex kullanarak: Öte yandan

,

BEGIN 
    blah 
END; 
/

dönüştürülmüş olacak! Yaşa!

İyi şanslar.

+0

Yarıçapla noktalı virgülle değiştirmeyi denedim ve iyi çalışıyor. Bununla birlikte, yarı benlilerle sahip olduğum bir kaç tane betik betiği var. Eğer eğik karınca ile yarı kolon değiştirirseniz, sql betiklerini başarılı bir şekilde çalıştırır, ancak tüm paketler hata nedeniyle derleme hatalarıyla oluşturulur 'Karşılaşılan sembol/Bu sorunu çözebilmemizin herhangi bir yolu var mı? Teşekkürler – user75ponic