2017-05-16 2 views
1

Je travaille avec Spock et Groovy afin de tester mon application. Je devrais lancer un script ddl avant de lancer chaque test. Pour exécuter le script à partir Groovy je suis en utilisant le code suivant:Exécuter le script ddl à partir du fichier dans Groovy

def scriptToExecute = './src/test/groovy/com/sql/createTable.sql' 
    def sqlScriptToExecuteString = new File(scriptToExecute).text 
    sql.execute(sqlScriptToExecuteString) 

Le createTable.sql est un script complexe qui ne plusieurs goutte et opération de création (de celui-ci est bien sûr multiligne). Lorsque je tente de l'exécuter, je suis l'exception suivante:

java.sql.SQLSyntaxErrorException: ORA-00911: caractère non valide

À noter que le ddl est correct depuis qu'il a été vérifié en cours d'exécution sur le même DB que je connecte avec groovy.

Une idée Comment résoudre le problème?

+0

Avez-vous un ';' fin dans les instructions de votre ddl? [Voir cette réponse] (http://stackoverflow.com/a/10728434/6730571) –

+0

https://www.techonthenet.com/oracle/errors/ora00911.php – Rao

+0

@HuguesMoreau Je comprends cela; est le problème mais si je n'utilise pas; entre 2 créer une déclaration alors je reçois: java.sql.SQLSyntaxErrorException: ORA-00922: option manquante ou invalide – Jack

Répondre

1

Je pense que JDBC ne supporte pas cela, mais il existe des outils/bibliothèques qui pourraient aider, voir this answer pour Java.

En Groovy, en utilisant cette JDBC script runner serait quelque chose comme:

Connection con = .... 
def runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]) 
def scriptFile = new File("createTable.ddl") 
scriptFile.withReader { reader -> 
    runner.runScript(reader) 
} 

Ou, si votre script est « assez simple » (aucun commentaire, aucune autre que la séparation des points-virgules des déclarations ...), vous pouvez charger le texte, divisé autour ; et exécuter en utilisant sql.withBatch, quelque chose comme ça:

def scriptText = new File("createTable.ddl").text 
sql.withBatch { stmt -> 
    scriptText.split(';').each { order -> 
     stmt.addBatch order.trim() 
    } 
} 
1

Si vous ne pouvez pas l'obtenir fait dans JDBC (Voir la réponse de Hugues), pensez à exécuter sqlplus de votre programme Groovy.

["sqlplus", CREDENTIALS, "@"+scriptToExecute].execute() 
+0

Ah, oui, bien sûr, l'utilisation de JDBC n'est pas une exigence! Bonne idée –