运行 来自 Groovy 中文件的 ddl 脚本
Run ddl script from file in Groovy
我与 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。
知道如何解决这个问题吗?
我认为 JDBC 不支持这个,但是 tools/libraries 可以提供帮助,请参阅 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)
}
或者,如果您的脚本是 "simple enough"(即没有注释,除了分隔语句之外没有分号...),您可以加载文本,围绕 ;
拆分它并使用 sql.withBatch
,类似这样的东西:
def scriptText = new File("createTable.ddl").text
sql.withBatch { stmt ->
scriptText.split(';').each { order ->
stmt.addBatch order.trim()
}
}
如果您无法在 JDBC 中完成(参见 Hugues 的回答),请考虑从您的 Groovy 程序中执行 sqlplus
。
["sqlplus", CREDENTIALS, "@"+scriptToExecute].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。
知道如何解决这个问题吗?
我认为 JDBC 不支持这个,但是 tools/libraries 可以提供帮助,请参阅 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)
}
或者,如果您的脚本是 "simple enough"(即没有注释,除了分隔语句之外没有分号...),您可以加载文本,围绕 ;
拆分它并使用 sql.withBatch
,类似这样的东西:
def scriptText = new File("createTable.ddl").text
sql.withBatch { stmt ->
scriptText.split(';').each { order ->
stmt.addBatch order.trim()
}
}
如果您无法在 JDBC 中完成(参见 Hugues 的回答),请考虑从您的 Groovy 程序中执行 sqlplus
。
["sqlplus", CREDENTIALS, "@"+scriptToExecute].execute()