2009-09-29 8 views

Répondre

0

Toutes les classes Java sont utilisables à partir Groovy. Si Groovy ne vous donne pas un moyen de le faire, alors vous pouvez le faire Java-way en utilisant JDBC callable statements.

0

Je viens de tombé sur ce qui pourrait être une solution à votre problème, si un exemple est ce que vous étiez après, un coup d'oeil à the reply to this thread

2

j'écrit une aide qui me permet de travailler avec des procédures stockées renvoie un seul ResultSet d'une manière similaire à l'utilisation de requêtes avec groovy.sql.Sql. Cela pourrait facilement être adapté pour traiter plusieurs ResultSets (je suppose que chacun aurait besoin de sa propre fermeture).

Utilisation:

Sql sql = Sql.newInstance(dataSource) 
SqlHelper helper = new SqlHelper(sql); 
helper.eachSprocRow('EXEC sp_my_sproc ?, ?, ?', ['a', 'b', 'c']) { row -> 
    println "foo=${row.foo}, bar=${row.bar}, baz=${row.baz}" 
} 

code:

class SqlHelper { 
    private Sql sql; 

    SqlHelper(Sql sql) { 
     this.sql = sql; 
    } 

    public void eachSprocRow(String query, List parameters, Closure closure) { 
     sql.cacheConnection { Connection con -> 
      CallableStatement proc = con.prepareCall(query) 
      try { 
       parameters.eachWithIndex { param, i -> 
        proc.setObject(i+1, param) 
       } 

       boolean result = proc.execute() 
       boolean found = false 
       while (!found) { 
        if (result) { 
         ResultSet rs = proc.getResultSet() 
         ResultSetMetaData md = rs.getMetaData() 
         int columnCount = md.getColumnCount() 
         while (rs.next()) { 
          // use case insensitive map 
          Map row = new TreeMap(String.CASE_INSENSITIVE_ORDER) 
          for (int i = 0; i < columnCount; ++ i) { 
           row[md.getColumnName(i+1)] = rs.getObject(i+1) 
          } 
          closure.call(row) 
         } 
         found = true; 
        } else if (proc.getUpdateCount() < 0) { 
         throw new RuntimeException("Sproc ${query} did not return a result set") 
        } 
        result = proc.getMoreResults() 
       } 
      } finally { 
       proc.close() 
      } 
     } 
    } 
} 
Questions connexes