A veces necesitamos crear una tabla dinámicamente, o sea por programa. Eso significa que dependiendo de los datos que introduzca el usuario o procese nuestro programa serán las columnas que tendrá la tabla.

En este artículo veremos una técnica para conseguir nuestro objetivo.

La tabla que crearemos tendrá dos columnas: una para guardar todas las fechas del rango especificado y otra para guardar si esa fecha corresponde a un feriado o no.

Por supuesto que en tus propias tablas creadas con esta técnica podrás tener muchas más columnas, y también podrás agregarle una Primary Key, Foreign Keys, índices, etc. Este ejemplo es simple y sencillo para mostrar la técnica, la cual podrá servirte de base para crear tablas muy complejas.

Todo lo que debemos hacer es crear un stored procedure que utilice el comando EXECUTE STATEMENT, como se ve a continuación:

CREATE PROCEDURE CREAR_TABLA_FECHAS(
   tcNombreTabla  VARCHAR(28),
   tdFechaInicial DATE,
   tdFechaFinal   DATE)
AS
   DECLARE VARIABLE lcComando VARCHAR(1024);
   DECLARE VARIABLE ldFecha   DATE;
BEGIN

   lcComando = 'CREATE TABLE ' || tcNombreTabla ||
             ' (TAB_FECHAX DATE,
                TAB_FERIAD CHAR(1))';

   EXECUTE STATEMENT :lcComando WITH AUTONOMOUS TRANSACTION;

   ldFecha = tdFechaInicial;

   WHILE (ldFecha <= tdFechaFinal) DO BEGIN
      lcComando = 'INSERT INTO ' || tcNombreTabla ||
                  ' (TAB_FECHAX, TAB_FERIAD)
           VALUES (''' || ldFecha || ''', ' || '''N'')';
      EXECUTE STATEMENT lcComando;
      ldFecha = ldFecha + 1;
   END

END;

Entonces, para ejecutar a este stored procedure escribiríamos algo como:

EXECUTE PROCEDURE CREAR_TABLA_FECHAS('Fechas2014', '01/JAN/2014', '31/DEC/2014')

Y este será el resultado que obtendremos:

CREAR1

Captura 1. Si haces clic en la imagen la verás más grande

Una tabla, llamada Fechas2014 (porque ese es el nombre que especificamos) que contiene dos columnas: TAB_FECHAX para guardar las fechas y TAB_FERIAD para guardar si la fecha corresponde a un feriado o no.

Y si revisamos el contenido de esa tabla, veremos algo como esto:

CREAR2

Captura 2. Si haces clic en la imagen la verás más grande

hay más filas, porque pedimos que tenga todas las fechas desde el 1 de enero de 2014 hasta el 31 de diciembre de 2014 y eso justamente es lo que tiene la tabla. Desde luego que aquí se muestran solamente algunas de esas filas.

Lo interesante es que la tabla fue creada por el stored procedure y también todas sus filas fueron insertadas por el stored procedure, el usuario no insertó esas filas.

Conclusión:

Usando el comando EXECUTE STATEMENT podemos crear, modificar, o borrar tablas dinámicamente, también insertarles filas, modificarlas, borrarlas, etc. Esto puede ser muy útil en muchas ocasiones pero debemos evaluar si vale la pena o no. ¿Por qué? primero, porque EXECUTE STATEMENT es lento, ya que recién en tiempo de ejecución el Firebird puede analizar la instrucción y segundo porque el Firebird puede detectar cualquier error que hayamos escrito solamente en tiempo de ejecución.

En este ejemplo hemos creado una tabla conteniendo dos columnas. Por supuesto que las tablas pueden tener muchas más columnas y también Primary Key, Foreign Keys, índices, etc. Todo puede hacerse con EXECUTE STATEMENT, por lo tanto debemos aprender a usarlo correctamente.

Artículos relacionados:

EXECUTE STATEMENT

El índice del blog Firebird21