Descripción: EXECUTE STATEMENT (ejecutar una sentencia, en castellano) recibe un argumento que es una cadena alfanumérica y la ejecuta. Si la sentencia devuelve datos, la cláusula INTO asigna esos datos a variables locales. Si la sentencia debe devolver más que una fila de datos, entonces se debe usar FOR…DO para crear un ciclo repetitivo.

EXECUTE STATEMENT que no devuelve datos:

Esta forma es usada con las instrucciones INSERTE, DELETE, UPDATE y EXECUTE PROCEDURE que no devuelven datos.

Sintaxis:

EXECUTE STATEMENT <sentencia>

<sentencia> = cualquier instrucción SQL que no devuelve datos

Ejemplo:

CREATE PROCEDURE EjemploExecuteStatement1 (tcNombreProcedure Varchar(100))
AS
   DECLARE VARIABLE cSentencia Varchar(1024);
   DECLARE VARIABLE nParametro Integer;
BEGIN
   SELECT
      MIN(MiColumna)
   FROM
      MiTabla
   INTO
      nParametro;
   cSentencia = 'EXECUTE PROCEDURE ' || tcNombreProcedure || '(' || CAST(nParametro AS VarChar(20)) || ')';
   EXECUTE STATEMENT cSentencia;
END

IMPORTANTE: Aunque puedes usar esta forma de EXECUTE STATEMENT para crear tablas, claves primarias, índices, etc., en general no es recomendable que lo hagas porque lo más probable es que te metas en problemas.

EXECUTE STATEMENT que devuelve una fila de datos:

Esta forma es usada con SELECTs que devuelven una fila de datos.

Sintaxis:

EXECUTE STATEMENT <sentencia_select> INTO <variable> [, <variable> …]

<sentencia_select> = una sentencia SQL que devuelve como máximo una fila de datos

                 <variable> = Una variable, opcionalmente precedida por :

Ejemplo:

CREATE PROCEDURE EjemploExecuteStatement2 (tcNombreTabla Varchar(100))
AS
   DECLARE VARIABLE nParametro Integer;
BEGIN
   EXECUTE STATEMENT
      'SELECT MAX(MiColumna) FROM ' || tcNombreTabla INTO :nParametro;
   IF (nParametro < 0 or nParametro > 100) THEN
      EXCEPTION EX_FUERA_RANGO 'Nota del alumno fuera de rango en ' || tcNombreTabla;
END

EXECUTE STATEMENT que devuelve muchas filas de datos:

 Esta forma (que es similar al FOR SELECT … DO) es usada con instrucciones SELECT que pueden devolver muchas filas de datos.

Sintaxis:

FOR EXECUTE STATEMENT <sentencia_select> INTO <variable> [, <variable> …] DO

<sentencia_compuesta>

<sentencia_select> = cualquier sentencia SELECT válida

<variable> = Cualquier variable que pueda ser usada en un stored procedure o trigger, opcionalmente precedida por :

Ejemplo:

CREATE PROCEDURE EjemploExecuteStatement3
   (cColumnaTexto Varchar(100),
    cNombreTabla  Varchar(100))
RETURNS
   (cLineaLarga Varchar(32000))
AS
   DECLARE VARIABLE cPedazo Varchar(100);
BEGIN
   cPedazo = '';
   FOR EXECUTE STATEMENT
      'SELECT ' || cColumnaTexto || ' FROM ' || cNombreTabla into :cPedazo
   DO BEGIN
      IF (cPedazo IS NOT NULL) THEN
         cLineaLarga = cLineaLarga || cPedazo || ' ';
      SUSPEND;
   END
END

Advertencias para usar EXECUTE STATEMENT

  1. El Firebird no valida (porque no puede hacerlo) la sentencia que escribes a continuación de las palabras EXECUTE STATEMENT, eso implica que toda la responsabilidad es tuya
  2. No puede verificar las dependencias para saber si las columnas o las tablas existen o no
  3. Las operaciones serán lentas porque las instrucciones a continuación de EXECUTE STATEMENT deben ser preparadas cada vez que van a ser ejecutadas
  4. La cadena alfanumérica que es usada como argumento no puede contener parámetros. Cualquier sustitución de variables debe ser hecha antes de que EXECUTE STATEMENT sea llamado
  5. Los valores devueltos son estrictamente chequeados por su tipo de datos para evitar impredecibles excepciones al cambiar el tipo de datos. Eso significa que si por ejemplo el campo devuelto debe ser Integer, la cadena alfanumérica ‘123456’ se convertirá en 123456 pero la cadena alfanumérica ‘abcde’ producirá un error de conversión.
  6. Las sentencias siempre son ejecutadas con los privilegios del usuario actual.

Usar EXECUTE STATEMENT no siempre es recomendable, debes usarlo solamente cuando no tienes alternativa o cuando las demás alternativas son más lentas.