我是SQL Fiddle的作者。这些知识可能有助于构建这个问题:
我正在尝试编写一些Groovy代码,它将在我的数据库中执行任意查询/ DML代码。基于我对Groovy Sql API的阅读,所有这些功能都期待一些特别的东西。例如,“eachRow”期望返回结果集;如果没有返回(例如,在UPDATE语句的情况下),那么使用它将引发错误。我可以用任何类型的语句调用“execute”,但是在使用它时我无法获取SELECT语句的结果集(这绝对是一个要求)。
此时我想我可能不得不放弃Groovy的Sql库,转而支持一些低级JDBC实现。我想这可能是一种耻辱,但如果有必要,我愿意去那里。不过,我非常希望尽可能保持Groovy-esqe。我该怎么做呢?
答案 0 :(得分:2)
查看返回boolean
的各种execute()
方法。根据doc的返回类型:
true
如果第一个结果是ResultSet
个对象;如果它是一个假的 更新计数或没有结果
示例中提到了CREATE,DROP和INSERT。我希望UPDATE的工作方式相同。
对于SELECT,如果存在ResultSet
,则必须检查该标志。如果是,则可以触发第二个查询以获取行。例如:
//If statement qualifies for select statements
//because .execute() will return true if there is a ResultSet
//present. It will be false for CREATE, UPDATE and DROP.
if( sql.execute("select name from Foo") ) {
//Fire the second query to get the rows in case of SELECT query
result = sql.rows "select name from Foo"
}
return result
<强>更新强>
如果出于性能原因需要两次执行查询,则可以尝试以下方法:
def queryString = "update Foo set name = 'hello' where name = 'baz'"
try {
sql.query queryString, { ResultSet rs ->
//Result set returned for select query only
//For all other cases exception is thrown
}
} catch( java.sql.SQLException ) {
//Throws exception for any other type of query
//By now you should be smart enough exception is not
//thrown for any other cause.
sql.execute queryString
}