Re: Uso de for en llenado de datos

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.

In response to

Responses

Browse pgsql-es-ayuda by date

  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