From: | Edwin Perez Lozano <edwinandperez(at)gmail(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)commandprompt(dot)com> |
Cc: | Juan Carlos Alemán Cuadros <jaleman(at)layconsa(dot)com(dot)pe>, pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Uso de for en llenado de datos |
Date: | 2007-05-14 15:36:32 |
Message-ID: | 1179156992.3010.21.camel@localhost |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
El sáb, 12-05-2007 a las 13:17 -0400, Alvaro Herrera escribió:
> Hay un ejemplo de manejo de excepciones que usa precisamente esta idea,
> en el capitulo de PL/pgSQL en el manual.
Hola Alvaro, gracias por el dato, me imagino que es el ejemplo
Exceptions with UPDATE/INSERT
(http://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING) en ese me base inicialmente pero aun no veo la forma de hacer lo que te comente incialmente, voy adicionar la funcion para ser un poco mas claro:
CREATE OR REPLACE FUNCTION impresion_guias(inicial bigint, final bigint)
RETURNS void as $$
DECLARE
remision tipo_impresion_guia%ROWTYPE;
BEGIN
FOR remision IN SELECT numero_remision, beneficiario, ciudad_origen,
ciudad_destino, codigo_centro_costo,
nombre_remitente, direccion_remitente, telefono_remitente,
nombre_destinatario, direccion_destinatario,
telefono_destinatario, tipo_servicio,
(CASE WHEN (guia_inicial < inicial) THEN inicial ELSE guia_inicial
END),
(CASE WHEN (guia_final < final) THEN guia_final ELSE final END)
FROM remision_guia
WHERE guia_inicial BETWEEN inicial AND final OR guia_final BETWEEN
inicial AND final LOOP
BEGIN
--realizo insert
INSERT INTO guia (numero_guia, codigo_tipo_servicio, tipo_servicio,
codigo_estado, tipo_estado, codigo_centro_costo,
beneficiario, ciudad_origen, ciudad_destino, numero_remision_guia)
SELECT seq, 5, remision.tipo_servicio, 6, 1,
remision.codigo_centro_costo, remision.beneficiario,
remision.ciudad_origen, remision.ciudad_destino,
remision.numero_remision
FROM generate_series(remision.guia_inicial, remision.guia_final) as
seq --se genera la serie de datos
EXCEPTION WHEN unique_violation THEN
--realizo update
UPDATE guia SET tipo_servicio=remision.tipo_servicio, codigo_estado=6,
tipo_estado=1,
codigo_centro_costo=remision.codigo_centro_costo,
beneficiario=remision.beneficiario,
ciudad_origen=remision.ciudad_origen,
ciudad_destino=remision.ciudad_destino,
numero_remision_guia=remision.guia_final
WHERE tipo_estado=1 AND numero_guia=seq; -- !como obtengo el valor
actual de seq para poder actualizar el registro que ya se encuentra en
la base de datos
END;
END LOOP;
END;
$$ LANGUAGE plpgsql;
Como se puede ver primero realizo un insert de acuerdo a un
generate_series() pero puede ocurrir que el identificador ya se
encuentre registrado en la tabla, por eso realize la excepcion para
realizar un update pero no encuetro la forma de obtener el identificador
exacto para realizar el update (en este caso el valor de seq)
Un posible solucion seria realizar un ciclo con los datos que se generan
en la serie (FOR variable IN FROM generate_series(x, y)) y dentro del
ciclo manejar el insert o update, pero me parece que es un ciclo
innecesario.
De antemano gracias por la info que me puedan brindar.
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2007-05-14 16:14:37 | Re: Uso de for en llenado de datos |
Previous Message | Alvaro Herrera | 2007-05-14 15:18:56 | Re: ERROR: relation "catalogo" does not exist |