如何在groovy中使用相同的代码执行查询和DML语句?

时间:2014-03-23 14:57:52

标签: sql jdbc groovy

我是SQL Fiddle的作者。这些知识可能有助于构建这个问题:

我正在尝试编写一些Groovy代码,它将在我的数据库中执行任意查询/ DML代码。基于我对Groovy Sql API的阅读,所有这些功能都期待一些特别的东西。例如,“eachRow”期望返回结果集;如果没有返回(例如,在UPDATE语句的情况下),那么使用它将引发错误。我可以用任何类型的语句调用“execute”,但是在使用它时我无法获取SELECT语句的结果集(这绝对是一个要求)。

此时我想我可能不得不放弃Groovy的Sql库,转而支持一些低级JDBC实现。我想这可能是一种耻辱,但如果有必要,我愿意去那里。不过,我非常希望尽可能保持Groovy-esqe。我该怎么做呢?

1 个答案:

答案 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
}