code: public void eachRow(String sql, List<Object> params, Closure metaClosure, Closure rowClosure) throws SQLException {
          eachRow(sql, params, metaClosure, 0, 0, rowClosure);
      }
docs: Performs the given SQL query calling the given Closure with each row of the result set.
  The row will be a <code>GroovyResultSet</code> which is a <code>ResultSet</code>
  that supports accessing the fields using property style notation and ordinal index values.
  In addition, the <code>metaClosure</code> will be called once passing in the
  <code>ResultSetMetaData</code> as argument.
  The query may contain placeholder question marks which match the given list of parameters.
  <p>
  Example usage:
  <pre>
  def printColNames = { meta ->
  (1..meta.columnCount).each {
  print meta.getColumnLabel(it).padRight(20)
  }
  println()
  }
  def printRow = { row ->
  row.toRowResult().values().each{ print it.toString().padRight(20) }
  println()
  }
  sql.eachRow("select * from PERSON where lastname like ?", ['%a%'], printColNames, printRow)
  </pre>
  <p>
  This method supports named and named ordinal parameters.
  See the class Javadoc for more details.
  <p>
  Resource handling is performed automatically where appropriate.
  
  @param sql         the sql statement
  @param params      a list of parameters
  @param metaClosure called for meta data (only once after sql execution)
  @param rowClosure  called for each row with a GroovyResultSet
  @throws SQLException if a database access error occurs