我使用Spock和Groovy来测试我的应用程序。我应该在运行每个测试之前运行一个ddl脚本。 要从Groovy执行脚本,我使用以下代码:
def scriptToExecute = './src/test/groovy/com/sql/createTable.sql'
def sqlScriptToExecuteString = new File(scriptToExecute).text
sql.execute(sqlScriptToExecuteString)
createTable.sql是一个复杂的脚本,可以执行多次删除和创建操作(当然它是多行的)。当我尝试执行它时,我得到以下异常:
java.sql.SQLSyntaxErrorException:ORA-00911:无效字符
要注意ddl是正确的,因为已经检查过它在我用groovy连接的同一个DB上运行它。
任何想法如何解决问题?
答案 0 :(得分:2)
我认为JDBC不支持这一点,但有些工具/库可以提供帮助,请参阅this answer了解Java。
在Groovy中,使用此JDBC script runner将类似于:
Connection con = ....
def runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror])
def scriptFile = new File("createTable.ddl")
scriptFile.withReader { reader ->
runner.runScript(reader)
}
或者,如果你的脚本足够简单" (即没有注释,除分隔语句之外没有分号......),您可以加载文本,将其拆分为;
并使用sql.withBatch
执行,类似:
def scriptText = new File("createTable.ddl").text
sql.withBatch { stmt ->
scriptText.split(';').each { order ->
stmt.addBatch order.trim()
}
}
答案 1 :(得分:1)
如果你无法在JDBC中完成它(请参阅Hugues的回答),请考虑从Groovy程序中执行sqlplus
。
["sqlplus", CREDENTIALS, "@"+scriptToExecute].execute()