从Groovy中的文件运行ddl脚本

时间:2017-05-16 15:11:28

标签: database jdbc groovy ddl execute

我使用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上运行它。

任何想法如何解决问题?

2 个答案:

答案 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()