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:
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:
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:
Paul Palacios
Abr 30, 2014 @ 20:51:26
Estimado Walter, en primer lugar agradezco toda la informacion y esfuerzo que pones a disposicion de la comunidad de usuarios de Firebird y Foxpro. Te quisiera consultar sobre acceso a bases de datos remotas, yo hice un programa foxpro+firebird en cliente-servidor y los resultados fueron optimos ya que todo fue en entorno LAN. Ahora tengo la necesidad de compartir el programa con usuarios remotos. ¿Que metodo recomendarias para que esos usuarios remotos accedan a la BD? Deberia pensar en una aplicacion Web necesariamente? Gracias por tu respuesta.
wrov
May 01, 2014 @ 01:31:01
Hola Paul
Lo único que necesitas es una IP pública o una VPN y listo, ya tu BD podrá ser accedida desde cualquier computadora del mundo que tenga conexión a Internet.
Desde luego que para ello necesitarán conocer el IP de la computadora donde se encuentra la BD, la ubicación y el nombre de la BD, el nombre de un usuario con permiso para conectarse y la contraseña de ese usuario.
Una IP pública cuesta unos 5 dólares mensuales, puede ser un poco más o un poco menos según tu proveedor de Internet, pero por ahí anda. Hay VPNs gratis pero generalmente limitan él número de conexiones concurrentes a un máximo de 5, las VPN de pago en cambio te permiten conectar a cualquier cantidad de usuarios.
Saludos.
Walter.
wrov
May 01, 2014 @ 01:35:52
Hay también otro punto importante a considerar y es el de la seguridad. Todos los datos que viajan por Internet pueden ser interceptados por lo hackers, entonces aunque creas que no tienes datos valiosos para ellos igualmente debes tomar precauciones porque podrían destruir tu BD solamente por diversión.
Te recomiendo que leas estos artículos:
Después de leerlos entenderás mejor el problema y conocerás una herramienta que podrás utilizar para complicarles la vida a los hackers y quizás hacerlos desistir de curiosear o dañar tus datos.
Saludos.
Walter.
Paul Palacios
May 01, 2014 @ 13:07:09
Gracias Walter, veo que ya habias abordado el tema en posts anteriores, la proxima vez intentaré buscar mas a fondo en tu blog antes de preguntar jejeje. Que pases un feliz dia del trabajador.
wrov
May 01, 2014 @ 13:22:41
Gracias Paul, e igualmente.
Saludos.
Walter.
Alexis
May 02, 2014 @ 09:06:28
Hola Walter
Gracias por éste otro de tus geniales aportes.
Disculpa que te haga una sugerencia – creo que seria una ayuda adicional si escribieras en que versión de Firebird funcionan dicho ejemplo. Como es en éste – lo de «AUTONOMOUS TRANSACTION» no funciona en Firebird 2.1.5.18497 ( 😦 he estado machacando un buen rato lo poco de cerebro que tengo hasta que leí por ahi en la red).
Saludos.
Alexis
wrov
May 02, 2014 @ 12:14:20
Hola Alexis
Es cierto, algunos ejemplos no funcionan en versiones anteriores de Firebird, yo uso y pruebo en 2.5.2, y la verdad que no tengo tiempo para probar con otras versiones también.
Saludos.
Walter.