Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Stored Procedure para insertar campos (https://www.clubdelphi.com/foros/showthread.php?t=83696)

jafera 17-07-2013 19:12:00

Buenas de nuevo.

He empezado con las pruebas, el insert a la tabla general ha funcionado de maravilla, en un tiempo record tanto desde el IBConsole como desde Delphi, un problema menos.

Luego intento ejecutar el script siguiente en IBConsole y me da error at line 1 - conversion from string""

Código SQL [-]
 
INSERT INTO CTR0003 ("DORSAL", "NOM", "COGNOM1", "COGNOM2", "CODI_CAT", "LLICENCIA", "DNI", "CLUB", "PUBLICITAT", "CODIUCI")
SELECT C1, C2, C3, C4, C6, C7, C8, C9, C11, C12 FROM CTR0003C
LEFT JOIN CTR0003 ON ( CTR0003C.C8 = CTR0003.DNI AND CTR0003C.C6 = CTR0003.CODI_CAT)
WHERE CTR0003.DNI IS NULL

Creo que he seguido al pie de la letra las instrucciones de escritura del script en cuestión. No se donde puedo haberme equivocado.

Gracias por vuestro tiempo

Josep

fjcg02 17-07-2013 20:14:20

Desconozco los componentes IB*, pero si con el ibconsole funciona... No se sí habrá algún otro componente de esa familia que te permita hacerlo.
Si no es así puedes hacer una store procedure e invocarla desde el programa.

Saludos

jafera 17-07-2013 20:20:42

Hola.

El error lo da en IBConsole, no en el componente.

Cita:

Empezado por jafera (Mensaje 464026)
Luego intento ejecutar el script siguiente en IBConsole y me da error at line 1 - conversion from string""

Gracias por todo lo demás ya tengo una parte "cocida" jejeje.

Saludos

fjcg02 17-07-2013 20:27:32

Ok, no entendí bien. Por lo que te dice, estás intentando cargar un campo de un tipo en otro campo de otro tipo. Tendrás que identificar el campo y hacer un cast para convertirlo al tipo de dato necesario.
En definitiva, que dorsal coincida con el tipo de C1y así sucesivamente.

Saludos

Casimiro Noteví 17-07-2013 21:13:31

Por cierto, puedes crear la base de datos con el 'character set' que quieras y te ahorras ponerlo en cada campo.
Además creo recordar (ahora mismo no estoy seguro) que también puedes poner el 'collate' en la creación de la bd.
Código SQL [-]
create database xxxxxxxxxxxxx character set yyyyyyy

También te puedes ahorrar poner los nombres entre comillas y entonces dará igual que los escribas en mayúsculas o minúsculas.

Código SQL [-]
CREATE TABLE CTR0003E (
  C1 VARCHAR(1),   
  C2 VARCHAR(1),
  C3 VARCHAR(1),   
  C4 VARCHAR(1),   
  C5 VARCHAR(25),   
  C6 VARCHAR(25),   
  C7 VARCHAR(20),   
  C8 VARCHAR(3),   
  C9 VARCHAR(3),  
  C10 VARCHAR(12),   
  C11 VARCHAR(12),   
  C12 VARCHAR(2),   
  C13 VARCHAR(12),   
  C14 VARCHAR(30),   
  C15 VARCHAR(3),   
  C16 VARCHAR(25),   
  C17 VARCHAR(15),   
  C18 VARCHAR(15),   
  C19 VARCHAR(15)  
);
Y si además usas dominios, entonces mucho más cómodo, pero eso lo dejo para otro momento :)

Te lo comento porque me parece "un trabajo de chinos" repetir tantas veces lo mismo y estar pendiente de las comillas, mayúsculas, minúsculas, etc.

fjcg02 17-07-2013 23:13:33

He comparado las tablas y los campos C1 y C6 tienen diferente tipo que los datos en los que se cargan en la tabla destino. Tendrás que hacer un cast.

Saludos

Código SQL [-]
CTR0003C              CTR0003  
C1  VARCHAR(3)  Diferente  DORSAL  INTEGER,
C2  VARCHAR(20)            NOM  VARCHAR(20)
C3  VARCHAR(25)            COGNOM1  VARCHAR(25)
C4  VARCHAR(25)            COGNOM2  VARCHAR(25)
C6  VARCHAR(3)  Diferente  CODI_CAT  INTEGER,
C7  VARCHAR(14)            LLICENCIA  VARCHAR(14)
C8  VARCHAR(12)            DNI  VARCHAR(12)
C9  VARCHAR(25)            CLUB  VARCHAR(25)
C11  VARCHAR(25)            PUBLICITAT  VARCHAR(25)
C12  VARCHAR(12)            CODIUCI  VARCHAR(12)

jafera 18-07-2013 11:11:52

Buenos dias a todos.

Viendo la respuesta de anoche, he efectuado el cambio en el campo COD_CAT, pasandolo a Integer en la tabla temporal, el otro campo DORSAL, sencillamente lo he quitado del Insert y al hacer la prueba en IBConsole ya no da el error de conversion, pero no tarda 15 segundos, se colapsa y lo aborto

Código SQL [-]
 
INSERT INTO CTR0003 ("NOM", "COGNOM1", "COGNOM2", "CODI_CAT", "LLICENCIA", "DNI", "CLUB", "PUBLICITAT", "CODIUCI")
SELECT C2, C3, C4, C6, C7, C8, C9, C11, C12 FROM CTR0003C 
LEFT JOIN CTR0003 ON (CTR0003C.C8 = CTR0003.DNI)
WHERE CTR0003.DNI IS NULL

Ahora si que me veo superado, yo que pensaba que iba por buen camino y que al final el San Benito saldría del taco de madera y por lo que veo me queda solo la astilla, (chiste antiguo malo, jejeje)

NOTA: En IBConsole lo he dejado en marcha más de 8 minutos y nada, no acaba. En IBExpert más de lo mismo.

Saludos

Josep

fjcg02 18-07-2013 12:57:34

Una pregunta...
cuanto tarda la select del insert ? Sólo la select

Código SQL [-]
SELECT C2, C3, C4, C6, C7, C8, C9, C11, C12 FROM CTR0003C 
LEFT JOIN CTR0003 ON (CTR0003C.C8 = CTR0003.DNI)
WHERE CTR0003.DNI IS NULL

y abusando un poco otra pregunta. Nos puedes poner los indices de las dos tablas ?

Me da que no tendría que tardar casi nada, algo no está suficientemente ajustado.

Un saludo

Casimiro Noteví 18-07-2013 13:15:38

Debería poner el código fuente de tu programa y datos para hacer pruebas, aunque ya sé que no puedes hacer eso.

jafera 18-07-2013 13:41:46

La consulta select se hace bastante rapido, pero si lugo toco en el grid donde se muestran los datos en IBConsole, se cuelga.

El código fuente se podria poner, pero no creo que sea lo conveniente ya que aun está bastante verde el tema y el prpopósito del programa es muy especifico y no se si le servirá a mucha gente, talvez para chafardear solo.

Lo que si puedo hacer es conectar con alguien con teamwiever o similar y verlo en directo

El tema índices, pues las tablas temporales no tienen y la definitiva tampoco, no se exactamente donde crearlos

Saludos

Josep

fjcg02 18-07-2013 13:42:03

Cita:

Empezado por Casimiro Notevi (Mensaje 464071)
Debería poner el código fuente de tu programa y datos para hacer pruebas, aunque ya sé que no puedes hacer eso.

Bueno Casi, en este caso lo que tarda es la sentencia enviada desde la consola. Previamente deberíamos hacerla funcionar a una velocidad aceptable, de ahí que le pida más información. Me da que no tiene que ser inmediata la respuesta, pero de ahí a que tarde más de 8 minutos....

Puedo suponer que no tendría que haber más de un ciento de corredores nuevos. Recuperarlos tendría que ser casi inmediato. Insertar hasta 300 registros... no sé, algo se nos escapa.

A ver qué nos responde jafera.

Un saludo

jafera 18-07-2013 13:52:13

Creo que lo que tarda es en devolver el select.

Os he dicho que era rápido epro solo los primeros registros, he hecho otra prueba y si navego por el grid, se me va parando a medida que voy bajando el curor.
Si intento bajar la scrollbar de golpe es cuando se cuelga.
No seran unos cientos registros, creo que seran unos miles.

Me da la sensación de que es como si estuviera procesando los registros del select en bloques de unos 30 registros.

Saludos

fjcg02 18-07-2013 14:10:19

Cita:

Empezado por jafera (Mensaje 464063)
Buenos dias a todos.

Código SQL [-]
 
INSERT INTO CTR0003 ("NOM", "COGNOM1", "COGNOM2", "CODI_CAT", "LLICENCIA", "DNI", "CLUB", "PUBLICITAT", "CODIUCI")
SELECT C2, C3, C4, C6, C7, C8, C9, C11, C12 FROM CTR0003C 
LEFT JOIN CTR0003 ON (CTR0003C.C8 = CTR0003.DNI)
WHERE CTR0003.DNI IS NULL

Varias cosas:
1. Revisa las tablas involucradas en la insert. Hablabas anteriormente de CTR0003, CTR0003E y CTR0003C, y no se´si por error hemos utilizado otras.
2.- ON (CTR0003C.C8 = CTR0003.DNI) Aquí supongo que te falta añadir el campo CODI_CAT, ya que según observabas en otra ocasión este campo interviene.
3.- Crea índices para CTR0003.DNI, CTR0003C.C8, CTR0003.CODI_CAT y CTR0003C.C6 y vuelve a ejecutar la select. Esto tiene que volar !!!!

Si quieres probar rápido, omite el paso 2 y por sólo los índices para CTR0003.DNI y CTR0003C.C8.

Queremos resultados YA !! :D

Un saludo

jafera 18-07-2013 16:33:48

^\||/^\||/#:-)##:-)##:-)#||-||||-||||-||^\||/^\||/

Ole, ole y ole.

Creo que se ha solucionado, indices, indices e indices.

Yo confundia indices con primary_key.

He puesto los indices en el campo referencia al DNI de las tres tablas et voilà los segundillos que decias.

Ufff que alivio más grande ya ni tiro la toalla ni abandono el barco como las ratas.......

Muchisimas gracias

Josep

fjcg02 18-07-2013 20:33:56

Eres un crack...;)

Un saludo

fjcg02 19-07-2013 11:21:58

Como norma general, al menos deberían generarse índices para :

0.- Las primary keys , cuyos ínidices se generan automáticamente.
1.- Aquellos campos por los que se cruza información con otras tablas. Estos son todos los que participan en las JOIN entre tablas. Generalmente coinciden con foreign-keys.
2.- Indice sin repetición en el campo descripción para todas las tablas maestras tipo clave - descripción.
3.- Aquellos campos por los que se ordena habitualmente: nombre, población, ...

Se debe tener en cuenta que añadir demasiados índices ( digo demasiados, no los necesarios ) puede ralentizar las inserciones.

Un saludo

jafera 19-07-2013 17:52:32

Queriais resultados?

Pues aquí van los resultados cronometrados igual que una carrera, jejeje...

1-Inserción de 63.000 registros procedentes de fichero txt nacional, borrado de los registros que cumplan una condición, consulta para actualizar el campo nacionalidad y el campo fecha de nacimiento, (datos procdentes del codigo UCI) 15 segundos.

2-Inserción de 30.000 registros procedentes de fichero txt autonomico, borrado de los registros que cumplan una condición, consulta para actualizar el campo nacionalidad y el campo fecha nacimiento, (datos procedentes del codigo UCI) 5.5 segundos.

3-Insertar los 30.000 registros que quedan en la tabla temporal nacional a la tabla definitiva 9 segundos.

4-Insertar de los 4.000 registros que quedan en la tabla autonomica y que no esten en la definitiva 3 segundos.

Ni me lo puedo creer, lo he realizado 7 u 8 veces porque me parecia imposible.

Que contento estoy!!!!!!!!

Como ya he dicho en algún que otro hilo anterior, pues eso, que MUCHAS GRACIAS!!!!!! y lo digo así de alto que no chillando.

Saludos calurosos desde la Costa Brava

Josep

Casimiro Noteví 19-07-2013 17:58:00

^\||/

.

fjcg02 19-07-2013 21:01:24

Te ha costado pero por fin lo has conseguido. ^\||/

Por aquí también mucho calor y mucha humedad, vamos, todo el día sudando.

Sigue informando.

Ahora planteare hacer la carga directamente desde los ficheros txt !!

Un saludo

fjcg02 19-07-2013 21:02:42

Ah, y a ver sí gana algún paisano del Euskaltel alguna etapa del Tour


La franja horaria es GMT +2. Ahora son las 11:57:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi