Hola,

Lo que yo haria, seria algo tipo RETURNING p.id, p.lastaction  asi podria tener no estaria trasmitiendo lo mismo que inserto o actualizo, y asi determinaria que le paso a cada registro.

Porque, nunca supe de determinar la accion con el on conflict. y si Alvaro no lo sabe, no se puede ;P

INSERT INTO public.prueba as p
(prb_id, nombre, lastaction)
SELECT x.prb_id, x.nombre, 'I'
  From json_to_recordset(_json) x
       (prb_id INTEGER, nombre VARCHAR)
ON CONFLICT (prb_id)
      DO UPDATE
         SET nombre = EXCLUDED.nombre, lastaction ='U'
RETURNING p.id, p.lastaction


On 14/1/20 18:45, Horacio Miranda wrote:

On 15/01/2020 10:41 am, mauricio pullabuestan wrote:
Buen día

Tengo una tabla a la cual envió un json para insertar o actualizar registros, me interesa mediante returing insertar en una tabla temporal los registros afectados y de alguna forma poder distinguir cuales se insertaron o actualizaron para poder interactuar después.

Alguna idea de como hacerlo?

Yo haría un merge y con un trigger en un update insertar en una tabla de updates y otro trigger insertar los datos nuevos ( eso es lo que quieres ? ).

Claro debe ser un after para no agregar latencia en la transacción.


dejo un scrip de como estoy haciéndolo

Saludos.
Mauricio

do $$
DECLARE _json json;

BEGIN

_json = '[{"prb_id":1,"nombre":"iten existe"},{"prb_id":2,"nombre":"iten No existe"}]';

CREATE TEMP TABLE _rs On COMMIT DROP
As
WITH t
AS
(
INSERT INTO public.prueba as p
(prb_id, nombre)
SELECT x.prb_id, x.nombre
  From json_to_recordset(_json) x
       (prb_id INTEGER, nombre VARCHAR)
ON CONFLICT (prb_id)
      DO UPDATE
         SET nombre = EXCLUDED.nombre
RETURNING p.*
)
Select *
  From t;

/*
Interactuar con registros nuevos

Interactuar con registros editados
*/

END
$$;

Select *
  From _rs;




Reply via email to