2010-07-29 3 views
15

ad eseguire un file di script sql da ANT funziona benissimo con la seguente operazione:ANT sql task: come eseguire SQL e PL/SQL e si nota un errore di esecuzione?

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

Ma se il file sql non contiene solo SQL puro, ma anche PL/SQL il compito avrà esito negativo. Questo potrebbe essere risolto utilizzando il seguente frammento:

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

Ma se il mio script contiene sia SQL e PL/SQL allora né compito ANT funzionerà. Un'altra soluzione potrebbe essere quella di utilizzare l'attività "exec" con "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> 

Ma purtroppo questo compito potrà mai fallire, quindi l'accumulo ritorna sempre con "di successo", anche se l'esecuzione dello script SQL non è riuscita. La proprietà error che ho provato a impostare non restituirebbe alcun codice di errore.

Qualche idea/suggerimento su come risolvere questo problema?

Grazie,

Peter

risposta

6

Peter,

Aggiungi agli inizi degli script

WHENEVER SQLERROR EXIT SQL.CODE; 

Poi sqlplus uscirà con il codice di uscita! = 0.

6

Abbastanza tardi, immagino - ma spero che questo aiuti qualcuno:

In generale, penso che dovremmo usare sql piuttosto che exec eseguibile = "sqlplus" per molte ragioni, ad esempio: nel caso in cui cambiamo fornitore di DB, non spendete le risorse in un nuovo processo con sql, " ARRESTO" funzionerà al contrario di sqlplus.exe ecc

Comunque, ecco un suggerimento su come lasciare sia PL/SQL & SQL nella stessa script in modo che funzioni:

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> 

poi dare il risultato di: <sql delimeter="/" src="myScript.sql"/>

spiegazione: Se si dispone di comandi SQL regolari:

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

saranno trasformati a:

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

che è equivlant - e la Il comando sql con delimitatore "/" può gestirli.

D'altra parte,

BEGIN 
    blah 
END; 
/

sarà trasformato per:

BEGIN 
    blas 
END/ 
/

e utilizzando la seconda regex - trasformata di nuovo a

BEGIN 
    blas 
END; 
/

Così ognuno vince! Evviva!

Buona fortuna.

+0

Ho provato a sostituire il punto e virgola con la barra e funziona correttamente. Tuttavia, ho un paio di pacchetti che creo script che ho con semi-colon. Se sostituisco i semi-punti con slash ant esegue script SQL con successo ma tutti i pacchetti sono creati con errori di compilazione a causa dell'errore 'Simbolo incontrato /' Ci sono dei modi per risolvere questo problema? Grazie – user75ponic