Groovy SQL eachRow要求返回ResultSet

qqrboqgw  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(52)

Groovy的SQL提供了一个eachRow()方法,但是如果正在执行的SQL语句没有产生ResultSet,例如,一个SQL语句,它似乎会生成一个无法捕获的错误。当然Groovy SQL也为不产生ResultSet的SQL语句提供了一个execute()方法。我的挑战是,如果SQL语句是由用户提供的,那么我想知道如何知道使用哪个方法?我希望eachRow()在没有ResultSet的情况下抛出一个可以被捕获/吞下的异常,但似乎不是这样。
这里有一个片段展示了我的尝试。在示例中,它从stdin读取SQL语句,并尝试使用eachRow()处理它们。

System.in.readLines().each {
    dbsql = it
    try {
        println "processing sql"
        dbconn.eachRow(dbsql) {
            n++
        }
        println "processed result ($n rows)"
    } catch(SQLException ex) {
      rslt = 2
      println ">>> query failed against ${dbhost}/${dbname}:")
      println "  ${ex}"
    } catch(Exception ex) {
      rslt = 255
      println ">>> general failure"
      println "  ${ex}"
    }

字符串
而不是任何一个catch块执行,我得到的错误消息看起来像,

Dec 01, 2023 12:45:13 AM groovy.sql.Sql eachRow
WARNING: Failed to execute:  insert into mytable (name) values ('John Doe'); because: This SQL statement does not return a single ResultSet
>>> query failed against dbhost/wrk:
  java.sql.SQLException: This SQL statement does not return a single ResultSet


希望有人可以帮助Groovy SQL的使用,在SQL语句是不知道提前,因为在这种情况下,他们来自一个文件。
注意:对于SELECT语句,一切都很顺利(因为它们返回ResultSets)。

chhqkbe1

chhqkbe11#

对于单个resultset或rowcount,groovy代码可以是这样的:

@Grab(group='com.microsoft.sqlserver', module='mssql-jdbc', version='12.4.2.jre8')
@GrabConfig(systemClassLoader=true)

import groovy.sql.Sql

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
def connectionUrl = "jdbc:sqlserver://...:1433;databaseName=...;user=...;password=...";  

def rsWorker = {hasResult, rs->
    if(hasResult){
        println "resultset:"
        rs.each{ println "  row: ${it}" }
    }else{
        println "update count: ${rs}"
    }
}

Sql.withInstance(connectionUrl){dbconn->
    dbconn.execute("select getdate() as today, 'hello' as world", rsWorker)
    dbconn.execute("create table #tmp(i int)", rsWorker)
    dbconn.execute("select getdate() as today, 'goodby' as world", rsWorker)
    dbconn.execute("update deleteme set iAnnualSum=0", rsWorker)
}

字符串
输出示例:

resultset:
  row: [today:2023-12-01 15:14:54.303, world:hello]
update count: 0
resultset:
  row: [today:2023-12-01 15:14:54.363, world:goodby]
update count: 28


数据库,如微软sql server支持多个结果集,我不知道如何处理他们在groovy。
但是,这里有一个很好的Java示例,可以很容易地移植到groovy:https://learn.microsoft.com/en-us/sql/connect/jdbc/using-multiple-result-sets?view=sql-server-ver16

相关问题