docs: public ResultSetAndStatement executeSQL(
          final String sql,
          ClassDescriptor cld,
          ValueContainer[] values,
          boolean scrollable)
          throws PersistenceBrokerException
      {
          if (logger.isDebugEnabled()) logger.debug("executeSQL: " + sql);
          final boolean isStoredprocedure = isStoredProcedure(sql);
          final StatementManagerIF sm = broker.serviceStatementManager();
          PreparedStatement stmt = null;
          ResultSet rs = null;
          try
          {
              stmt = sm.getPreparedStatement(cld, sql,
                      scrollable, StatementManagerIF.FETCH_SIZE_NOT_EXPLICITLY_SET, isStoredprocedure);
              if (isStoredprocedure)
              {
                  // Query implemented as a stored procedure, which must return a result set.
                  // Query sytax is: { ?= call PROCEDURE_NAME(?,...,?)}
                  getPlatform().registerOutResultSet((CallableStatement) stmt, 1);
                  sm.bindValues(stmt, values, 2);
                  stmt.execute();
                  rs = (ResultSet) ((CallableStatement) stmt).getObject(1);
              }
              else
              {
                  sm.bindValues(stmt, values, 1);
                  rs = stmt.executeQuery();
              }
  
              // as we return the resultset for further operations, we cannot release the statement yet.
              // that has to be done by the JdbcAccess-clients (i.e. RsIterator, ProxyRsIterator and PkEnumeration.)
              return new ResultSetAndStatement(sm, stmt, rs, new SelectStatement()
              {
                  public Query getQueryInstance()
                  {
                      return null;
                  }
  
                  public int getColumnIndex(FieldDescriptor fld)
                  {
                      return JdbcType.MIN_INT;
                  }
  
                  public String getStatement()
                  {
                      return sql;
                  }
              });
          }
          catch (PersistenceBrokerException e)
          {
              // release resources on exception
              sm.closeResources(stmt, rs);
              logger.error("PersistenceBrokerException during the execution of the SQL query: " + e.getMessage(), e);
              throw e;
          }
          catch (SQLException e)
          {
              // release resources on exception
              sm.closeResources(stmt, rs);
              throw ExceptionHelper.generateException(e, sql, cld, values, logger, null);
          }
      }