Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-07-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Stored Procedure para insertar campos

Buenas a todos.

En un hilo anterior me enseñasteis como hacer un update a una tabla destino con los datos de una tabla origen utilizando un stored procedure, un proceso que realizado con locate y sql tardaaaaaa.....aaaaba mucho se hace en un plis plas.

Ahora necesito saber como lo tengo que hacer para insertar los datos de la tabla origen que no esten en la tabla destino con el mismo sistema debido a su velocidad de vertigo, (parece el AVE).

Lo que realizo es un update si DNI=DNI y COD_CAT=COD_CAT ya que una persona puede tener dos licencias con el mismo DNI pero diferente COD_CAT (codigo categoria).

Una vez la tabla tiene datos el update comprueba DNI y COD_CAT y si lo encuentra, pues lo actualiza, pero si no lo encuentra necesito añadirlo.

Algún maestro del sql me puede echar un cable?

No se de que manera puedo saber antes del insert que datos existen y que datos no, aquí mi GRAN duda.

Saludos

Josep
Responder Con Cita
  #2  
Antiguo 16-07-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.046
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Aclara un poco más los campos y lo que quieres hacer.
Responder Con Cita
  #3  
Antiguo 16-07-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Gracias Antonio

He querido retomar un poco el hilo del 2011 en el que al final me querias comprar un velero, jejeje...

Pues como decia antes tengo una tabla nacional origen de los datos con campos varchar excepto un integer campos C1, C2, C3, C4...C14, esta tabla la lleno con datos procedentes de un fichero txt que me envian semanalmente, este tema tambien lo comentamos hace unas semanas y funciona a la perfección, luego tengo una tabla origen autonomica que se llena con el mismo sistema.

Despues debo pasar los datos primero de la tabla nacional a la tabla destino con campos varchar nombre, apellido1, apellido2, etc codigo categoria integer.

Si la tabla destino que es tabla sobre la cual trabajo, tiene datos entrados, pues el stored procedure me los actualiza en un santiamen, pero si el corredor no esta en la tabla ya que es nuevo de esta semana, debo insertarlo.

Ademas una vez hecho esto debo insertar los datos procedentes de las tablas autonomicas que no existan en la tabla principal.

El motivo es que las licencias de corredores las emite la RFEC pero las autonomias, emiten unas licencias validas solo en la región correspondiente para carreras locales, un corredor con licencia autónoma vasca no puede participar en carreras andaluzas, por ejemplo y evidentemente estos datos autonómicos no figuran en las tablas RFEC, por esos se deben añadir.

Aquí mi problema.

No se si se entiende bien el problema, antes yo hacia la actualización con locate y sql y me podia ir a comer mientras el proceso estaba en marcha, una vez implantado el update con procedimeiento almacenado el tiempo de actualización es casi imperceptible de ahí que me gustaría hecer los insert con un sistema parecido.

Este es el codigo del procedure para actualizar:

Código SQL [-]
 
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;
/* Stored procedures */
CREATE PROCEDURE "ACTUALITZA_REFC" 
AS
BEGIN EXIT; END ^

ALTER PROCEDURE "ACTUALITZA_REFC" 
AS
declare variable DNI VARCHAR(12) CHARACTER SET ISO8859_1;
declare variable LLICENCIA VARCHAR(14) CHARACTER SET ISO8859_1;
declare variable NOM VARCHAR(20) CHARACTER SET ISO8859_1;
declare variable COGNOM1 VARCHAR(25) CHARACTER SET ISO8859_1;
declare variable COGNOM2 VARCHAR(25) CHARACTER SET ISO8859_1;
declare variable CODIUCI VARCHAR(12) CHARACTER SET ISO8859_1;
declare variable CODI_CAT INTEGER;
declare variable CLUB VARCHAR(25) CHARACTER SET ISO8859_1;
declare variable PUBLICITAT VARCHAR(25) CHARACTER SET ISO8859_1;
begin
FOR SELECT C11, C10, C5, C6, C7, C8, C13, C14, C16
      FROM CTR0003E
      INTO :DNI, :LLICENCIA, :NOM, :COGNOM1, :COGNOM2, :CODI_CAT, :CODIUCI, :CLUB, :PUBLICITAT
  DO BEGIN
    UPDATE CTR0003 SET
           LLICENCIA=:LLICENCIA,
           NOM=:NOM,
           COGNOM1=:COGNOM1,
           COGNOM2=:COGNOM2,
           CODIUCI=:CODIUCI,
           CODI_CAT=:CODI_CAT,
           CLUB=:CLUB,
           PUBLICITAT=:PUBLICITAT
    WHERE DNI = :DNI AND CODI_CAT=:CODI_CAT;
  END  
end
 ^
SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;
Saludos

Última edición por ecfisa fecha: 16-07-2013 a las 18:15:00. Razón: Quitar caritas del código
Responder Con Cita
  #4  
Antiguo 16-07-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.046
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Perdona, pero esta calor no me deja pensar bien
El caso es que no acabo de entender exactamente el proceso.
¿Tienes los datos de los ciclistas en una tabla y quieres insertarlo en otra distinta?
Responder Con Cita
  #5  
Antiguo 16-07-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Mas o menos.

Explico el proceso:

1- Obtengo el txt nacional y lo cargo en una tabla temporal de firebird
2- Obtengo los txt autonomicos y los cargo en unas tablas temporales (una por autonomia) ya que los datos pueden variar en su formato
3- Paso los datos de la tabla temporal nacional a la tabla general de trabajo
4- Paso los datos de las tablas autonomicas a la tabla principal de trabajo, es decir quiero añadir los corredores que no tienen licencia nacional pero si autonómica.

Los pasos 3 y 4 es donde demoro mucho tiempo en actualizar, si la tabla tiene datos pues estos se actualizan sin problema con el stored procedure, pero si los datos no existen se deben añadir y no se como hacerlo.

He dudado en si seria mejor borrar toda la tabla principal y hacer un insert masivo de los datos nacionales y luego solo insertar los autonomicos que no figuren en la misma, pero estoy en el mismo punto de inflexión, no se como ejecutar estos procesos sin un update con sql el cual me lleva mucho tiempo en realizarse.

Gracias de nuevo

Josep

Última edición por jafera fecha: 16-07-2013 a las 19:32:02.
Responder Con Cita
  #6  
Antiguo 16-07-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.046
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Seguramente lo más rápido es borrar la "nacional" y luego hacer inserts de las "autonómicas". Te ahorras buscar en cada uno y actualizar en los que ya existen.

Puedes hacer un select de todas las tablas "autonómicas" con inner join y luego un insert, por ejemplo, algo parecido a esto:

Código SQL [-]
delete from tbNacionales;

for select *
  from tbAndalucia ...
  inner join tbExtremadura ...
  inner join tbGalicia ...
  ...
  into dato1, dato2, dato3, dato4, dato5, ...
do
begin
  insert into tbNacionales values (:dato1,:dato2,:dato3,...)
end
Responder Con Cita
  #7  
Antiguo 16-07-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.046
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por jafera Ver Mensaje
He querido retomar un poco el hilo del 2011 en el que al final me querias comprar un velero, jejeje...
Eso está ahora bastante lejos de mis posibilidades
Pero no pierdo la esperanza , de momento tengo ya titulación
Responder Con Cita
  #8  
Antiguo 16-07-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Eso es importante, yo to tampoco tengo barco pero si título, ya se sabe en casa del herrero cuchara de palo.
Responder Con Cita
  #9  
Antiguo 16-07-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.046
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por jafera Ver Mensaje
Eso es importante, yo to tampoco tengo barco pero si título, ya se sabe en casa del herrero cuchara de palo.
Habrá que esperar algún buen chollo, o una lotería, lo que llegue primero
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Aportación del código de un stored procedure para conversión literal de números birmain Firebird e Interbase 12 16-07-2015 19:12:29
Insertar desde una tabla con loop en stored procedure Fita Firebird e Interbase 2 04-06-2013 00:39:23
Problema con Stored Procedure para actualizar tabla con datos de otra tabla. Adrian Murua MySQL 4 04-02-2012 02:54:49
Insertar en Un Stored Procedure DasGrun Firebird e Interbase 7 13-12-2011 23:46:20
Stored Procedure !!! Ledian_Fdez C++ Builder 0 02-03-2010 14:01:29


La franja horaria es GMT +2. Ahora son las 18:32:47.


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