code: public void execute(String sql, Closure processResults) throws SQLException {
          Connection connection = createConnection();
          Statement statement = null;
          try {
              statement = getStatement(connection, sql);
              boolean isResultSet = statement.execute(sql);
              int updateCount = statement.getUpdateCount();
              while(isResultSet || updateCount != -1) {
                  if (processResults.getMaximumNumberOfParameters() != 2) {
                      throw new SQLException("Incorrect number of parameters for processResults Closure");
                  }
                  if (isResultSet) {
                      ResultSet resultSet = statement.getResultSet();
                      List<GroovyRowResult> rowResult = resultSet == null ? null : asList(sql, resultSet);
                      processResults.call(isResultSet, rowResult);
                  } else {
                      processResults.call(isResultSet, updateCount);
                  }
                  isResultSet = statement.getMoreResults();
                  updateCount = statement.getUpdateCount();
              }
          } catch (SQLException e) {
              LOG.warning("Failed to execute: " + sql + " because: " + e.getMessage());
              throw e;
          } finally {
              closeResources(connection, statement);
          }
      }
docs: Executes the given piece of SQL.
  Also calls the provided processResults Closure to process any ResultSet or UpdateCount results that executing the SQL might produce.
  <p>
  Example usages:
  <pre>
  boolean first = true
  sql.execute "{call FindAllByFirst('J')}", { isResultSet, result {@code ->}
  if (first) {
  first = false
  assert !isResultSet {@code &&} result == 0
  } else {
  assert isResultSet {@code &&} result == [[ID:1, FIRSTNAME:'James', LASTNAME:'Strachan'], [ID:4, FIRSTNAME:'Jean', LASTNAME:'Gabin']]
  }
  }
  </pre>
  <p>
  Resource handling is performed automatically where appropriate.
  
  @param sql the SQL to execute
  @param processResults a Closure which will be passed two parameters: either {@code true} plus a list of GroovyRowResult values
  derived from {@code statement.getResultSet()} or {@code false} plus the update count from {@code statement.getUpdateCount()}.
  The closure will be called for each result produced from executing the SQL.
  @throws SQLException if a database access error occurs
  @since 2.3.2