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)
-   -   Insert or update dependiendo de pk (https://www.clubdelphi.com/foros/showthread.php?t=69372)

Joe_Balda 13-08-2010 13:18:36

insert or update dependiendo de PK
 
Buen dia gente del foro:

Estoy intentando realizar un Stored Procedure que inserte o modifique registros en una tabla dependiendo de su PK.

Buscando encontre en la web encontre un ejemplo que se ve como sigue:

Código SQL [-]BEGIN insert into t1 (id, c1, c2) values (:id, :c1, :c2) WHEN SQLCODE -803 DO update t1 set c1 = :c1, c2 = :c2 WHERE id = :id; END


El ejemplo funciona perfectamente pero yo lo reemplazo por algo asi


Código SQL [-]BEGIN insert into t1 (t1.id, t1.c1, t1.c2) select t2.id,t2.c1,t3.c1 from t2 inner join t3 on .... WHEN SQLCODE -803 DO update t1 set c1 = (Select c1 from t3 where t1.id = t3.id ); END


El stored procedure se genera y funciona , el problema que tengo es que la parte de INSERT solo la realiza si la tabla T1 esta vacia.

Alguna sugerencia o alternativa espero

Utilizo firebird 2.0 y IBOConsole.

saludos

Joe_Balda 13-08-2010 14:43:36

Insert or update dependiendo de pk
 
Necesito insertar registros en una tabla desde otra , para lo cual ejecuto un codigo com el que sigue
Código SQL [-]
  Insert into TablaDestino
    Select *
      from TablaFuente
     where condiciones;

Si ejecuto el codigo por segunda vez, como hacer para detectar si el registro existe en tabladestino y en ese caso realizar un Update.

cloayza 13-08-2010 15:37:27

Si estas utilizando Firebird podri quedar asi...
Código SQL [-]
 Update Or Insert Into TablaDestino
    Select *
      from TablaFuente
     where condiciones;

Otra forma:

Código SQL [-]
MERGE INTO TablaDestino TD
   USING (SELECT * FROM TablaFuente) TF
   ON (TD.Campo_De_Union=TF.Campo_De_Union)
WHEN MATCHED THEN
   UPDATE SET
       Campo2=TF.Campo2
WHEN NOT MATCHED THEN
    INSERT (Campo1, Campo2)
    VALUES (TF.Campo1, TF.Campo2)

Saludos

Neftali [Germán.Estévez] 13-08-2010 16:02:30

Joe_Balda no repitas hilos. hace apenas 2 horas has colocado el mismo aquí.

Te recomiendo que revises la Guía de estilo de los foros.

Joe_Balda 13-08-2010 16:04:12

Muchas gracias por la respuesta, el primer codigo por lo que lei funciona a partir de la version 2.1 de firebird, yo utilizo la version 2.0.

El codigo que utiliza el MERGE, no me lo reconoce cuando lo quiero insertar en un STORED PROCEDURE o en el editor de sql. Utilizo IBOConsole.

Alguna idea de que me falta o que error estoy cometiendo?

saludos


La franja horaria es GMT +2. Ahora son las 22:32:54.

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