2017-05-16 43 views
1

我使用Spock和Groovy来测试我的应用程序。我需要在运行每个测试之前运行ddl脚本。 要执行脚本在Groovy我使用下面的代码:从Groovy中的文件运行ddl脚本

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是正确的DB,我连接groovy。

任何想法如何解决这个问题?

+0

在ddl语句中是否有尾随';'? [看到这个答案](http://stackoverflow.com/a/10728434/6730571) –

+0

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

+0

@HuguesMoreau我明白,是问题,但如果我不使用;之间2创建语句然后我得到:java.sql.SQLSyntaxErrorException:ORA-00922:丢失或无效的选项 – Jack

回答

1

我认为JDBC不支持这个,但有些工具/库可以提供帮助,请参阅this answer

在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

如果你不能把它在JDBC进行(见雨果的答案),考虑你的Groovy程序执行sqlplus

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

啊,是的,当然,使用JDBC并不是必需的!好主意 –