En este artículo habíamos visto como insertar datos que se encuentran en un archivo externo dentro de una tabla de Firebird:
https://firebird21.wordpress.com/2013/03/03/insertando-una-gran-cantidad-de-filas/
Ahora veremos el proceso inverso: crear un archivo externo e insertarle filas.
En realidad es muy sencillo.
CREATE TABLE MITABLAEXTERNA EXTERNAL 'E:\DATABASES\EXTERNA.TXT' ( EXT_IDENTI SMALLINT, EXT_NOMBRE VARCHAR(40));
Como ves, al comando CREATE TABLA solamente se le agrega la palabra clave EXTERNAL y el nombre que queremos darle al archivo externo, rodeado con apóstrofos.
Para insertarle datos, se hace exactamente igual que con una tabla normal:
INSERT INTO MITABLAEXTERNA (EXT_IDENTI, EXT_NOMBRE) VALUES (1, 'MARCELA') INSERT INTO MITABLAEXTERNA (EXT_IDENTI, EXT_NOMBRE) VALUES (2, 'SILVIA')
Captura 1. Si haces clic en la imagen la verás más grande
Pero a una tabla externa no se le pueden actualizar filas ni tampoco borrar filas. Solamente se le pueden insertar filas.
Si ahora abrimos el archivo ‘EXTERNA.TXT’ con el bloc de notas, esto es lo que veremos:
Captura 2. Si haces clic en la imagen la verás más grande
Los nombres se ven bien, pero los números no. ¿Por qué? ¿qué pasó?
Es que los números se guardan con su representación binaria, no como su representación de texto. En otras palabras, todos los números serán ilegibles para la gran mayoría de los seres humanos. ¿Y cuál es la solución? Muy fácil, que todas las columnas sean de tipo CHAR, así siempre podremos visualizarlas correctamente:
CREATE TABLE MITABLAEXTERNA2 EXTERNAL 'E:\DATABASES\EXTERNA2.TXT' ( EXT_IDENTI CHAR(5), EXT_NOMBRE CHAR(40));
Y como ahora todas las columnas son de tipo CHAR entonces podemos rodear a las constantes con apóstrofos si queremos (pero no es obligatorio con las constantes numéricas):
INSERT INTO MITABLAEXTERNA (EXT_IDENTI, EXT_NOMBRE) VALUES ('1', 'MARCELA') INSERT INTO MITABLAEXTERNA (EXT_IDENTI, EXT_NOMBRE) VALUES ('2', 'SILVIA')
Y si ahora abrimos el archivo ‘EXTERNA2.TXT’ con el bloc de notas, esto es lo que veremos:
Captura 3. Si haces clic en la imagen la verás más grande
¡¡¡PERFECTO!!! ya vemos los identificadores y los nombres de las personas. Que es exactamente lo que deseábamos.
Si los datos que queremos insertar se encuentran en alguna tabla de Firebird (que es el caso más común) entonces para insertarlos podemos utilizar una subconsulta:
INSERT INTO MITABLAEXTERNA2 (EXT_IDENTI, EXT_NOMBRE) SELECT CLI_IDENTI, CLI_NOMBRE FROM CLIENTES
Captura 4. Si haces clic en la imagen la verás más grande
A las dos filas que ya teníamos anteriormente en nuestra tabla externa ahora se le agregaron los datos de los clientes. Usar SELECT para insertar datos a las tablas es lo más rápido que existe.
IMPORTANTE:
Un archivo externo no puede tener Primary Key, ni Foreign Key, ni cualquier clase de índices. ¿Por qué no? porque no tiene sentido, ya que puede ser abierto por cualquier programa (como el Bloc de notas del Windows, por ejemplo) y por lo tanto está afuera del control del Firebird. Las restricciones y los índices solamente tienen sentido si están bajo el control del Firebird.
Tampoco se justifica especificar que una columna será NOT NULL porque en un archivo externo todas las columnas siempre son NOT NULL, así que declarar a una columna como NOT NULL es innecesario.
Conclusión:
Tener la posibilidad de exportar datos en archivos externos puede ser muy importante en algunas ocasiones, con Firebird es muy fácil hacerlo, solamente debemos recordar que a esos archivos solamente se le pueden insertar datos, no se puede modificar esos datos ni borrarlos. Y también hay que recordar que los archivos externos no pueden tener restricciones ni índices porque como son externos entonces pueden ser abiertos por otros programas y en ese caso se encontrarían afuera del control del Firebird.
Artículos relacionados:
altp1972angel
Feb 13, 2014 @ 13:47:47
Buenas Walter.
Estoy intentando implementar un procedimiento almacenado desde el cual crear un fichero físico para emitir la Remesa de Recibos.
El problema es que cuando me creo la tabla con execute statement, seguídamente no me permite insertar datos en esa tabla pues me da error diciendo que la tabla no existe.
Tienes alguna idea para poder implementarlo? Necesito hacerlo en ese momento.
Gracias
wrov
Feb 13, 2014 @ 15:17:11
El problema es que después de crear una tabla y antes de que puedas usarla tienes que hacerle un COMMIT. Y en los stored procedures no se puede escribir un COMMIT. Entonces la solución es ejecutar dos stored procedures. El primero es el que se encarga de crear la tabla y el segundo es el que le inserta datos.
Saludos.
Walter.
angel
Feb 13, 2014 @ 17:25:21
Gracias.
Eso es lo que estoy haciendo. Yo buscaba una posibilidad para hacerlo todo junto.
wrov
Feb 13, 2014 @ 19:02:38
No existe esa posibilidad en Firebird.
Saludos.
Walter.
Andres Pineda
Dic 23, 2015 @ 10:36:42
Buenos Días,
Quería consultarles si habría la posibilidad cuando realizo el insert en mi tabla externa, que los registros se guarden por fila ?
Gracias de antemano
wrov
Dic 25, 2015 @ 13:59:39
Los registros siempre se guardan por filas, ¿cómo te parece que se guardan en tu caso?
Saludos.
Walter.
jhironsel
Sep 24, 2023 @ 08:46:18
Esa persona tiene razón.
Aun en firebird 4 sigue ese error.
No agrega salto de linea en los registros y agrega un espacio que no pueden ser eliminados en tiempo de inserción del registro, un ejemplo de esto es:
48575443000001DA 485754430000029A 4857544300000321 485754430000049F 4857544300000538 4857544300000548 48575443000006EE 48575443000007BA 485754430000092F 4857544300000C67
Lo anterior es una sola linea con un espacio ‘ ‘ de este tamaño.
Concatenando esto al campo ||ASCII_CHAR(10), si podremos obtener fin de lineas por cada registro. Ejemplo.
48575443000001DA
485754430000029A
4857544300000321
485754430000049F
4857544300000538
4857544300000548
48575443000006EE
48575443000007BA
485754430000092F
4857544300000C67
No vale poner LEFT RIGHT o TRIM al campo para quitar estos espacio.
jhironsel
Sep 24, 2023 @ 08:52:22
https://mega.nz/file/VgcU0QDQ#1i5YmmH2p6cvW2LzuyGDeww6FCR0BBHFQqKbSXmgeEY
Para entender el comentario una imagen.
jhironsel
Sep 24, 2023 @ 09:29:38
Al final del día, tuve que utilizar un comando en linux para eliminar el espacio innecesario en el archivo.
tr -d ‘ ‘ archivo_sin_espacios.txt
Este comando realiza esa tarea bastante rápido…
comregcom
Oct 02, 2018 @ 20:47:40
Hola Walter,
Si quiero sumar los valores de dos tablas con la misma primary key antes de exportar como sería la consulta.
TA
1 10
2 11
3 5
TB
1 1
2 20
3 4
Archivo txt
1 11
2 31
3 9
Gracias como siempre