Groovy SQL eachRow要求返回ResultSet

qqrboqgw  于 2024-01-06  发布在  其他
关注(0)|答案(1)|浏览(232)

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

  1. System.in.readLines().each {
  2. dbsql = it
  3. try {
  4. println "processing sql"
  5. dbconn.eachRow(dbsql) {
  6. n++
  7. }
  8. println "processed result ($n rows)"
  9. } catch(SQLException ex) {
  10. rslt = 2
  11. println ">>> query failed against ${dbhost}/${dbname}:")
  12. println " ${ex}"
  13. } catch(Exception ex) {
  14. rslt = 255
  15. println ">>> general failure"
  16. println " ${ex}"
  17. }

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

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


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

chhqkbe1

chhqkbe11#

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

  1. @Grab(group='com.microsoft.sqlserver', module='mssql-jdbc', version='12.4.2.jre8')
  2. @GrabConfig(systemClassLoader=true)
  3. import groovy.sql.Sql
  4. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
  5. def connectionUrl = "jdbc:sqlserver://...:1433;databaseName=...;user=...;password=...";
  6. def rsWorker = {hasResult, rs->
  7. if(hasResult){
  8. println "resultset:"
  9. rs.each{ println " row: ${it}" }
  10. }else{
  11. println "update count: ${rs}"
  12. }
  13. }
  14. Sql.withInstance(connectionUrl){dbconn->
  15. dbconn.execute("select getdate() as today, 'hello' as world", rsWorker)
  16. dbconn.execute("create table #tmp(i int)", rsWorker)
  17. dbconn.execute("select getdate() as today, 'goodby' as world", rsWorker)
  18. dbconn.execute("update deleteme set iAnnualSum=0", rsWorker)
  19. }

字符串
输出示例:

  1. resultset:
  2. row: [today:2023-12-01 15:14:54.303, world:hello]
  3. update count: 0
  4. resultset:
  5. row: [today:2023-12-01 15:14:54.363, world:goodby]
  6. 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

展开查看全部

相关问题