From: | dculotta(at)fibertel(dot)com(dot)ar |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Problemas para terminar una función PL/Pgsql |
Date: | 2007-01-12 18:50:06 |
Message-ID: | f06c279d23ce.45a7ae2e@fibertel.com.ar |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Buenas tardes lista.
Estoy queriendo armar la siguiente función.
Lo que debería hacer, es lo siguiente:
1) Primero busca registros que se encuentran en una tabla aparte, desde la cual tiene que hacer updates.
2) Si no encuentra lo que se considera el campo clave, no hace nada.
3) Si lo encuentra, se fija que ya exista en la tabla correcta. Si no existe, lo inserta.
Hasta acá todo bien.
4) Si el campo clave existe, no debe hacer un insert, sino reemplazar sólo las columnas que sean diferentes. No puedo hacer un delete y luego un insert porque en la actualización, no llegan todos los campos.
5) Por eso, hago una comparación por campo y hago update solo de las columnas que trean valor.
Mi problema es que, en teoría, logro armar el string sql como corresponde, pero hago agua al momento de ejecutarlo.
Agradeceré cualquiera ayuda, e incluso cualquier critica que sirva para mejorar la función.
Gracias.
CREATE OR REPLACE FUNCTION updatedatos()
RETURNS int4 AS
$BODY$
DECLARE
myrows RECORD;
thisrow RECORD;
thiscolumn RECORD;
flag INTEGER;
strcond VARCHAR;
strsql VARCHAR;
BEGIN
FOR myrows IN SELECT * FROM datosorigen LOOP
/* No hay EAN para poder cruzar informacion */
IF myrows.usuario IS NULL THEN
flag = 0;
ELSE
/* Hay registro */
SELECT INTO thisrow * FROM datosusuarios WHERE usuario = myrows.usuario;
IF thisrow.usuario IS NULL THEN
/* No está en la tabla, se insertan todos los campos */
BEGIN
insert into datosusuarios values (myrows.usuario,myrows.apellido,myrows.nombre);
EXCEPTION
WHEN RAISE_EXCEPTION THEN
flag = 5;
RETURN flag;
END;
ELSE
strcond = null;
IF myrows.apellido IS NOT NULL THEN
IF strcond IS NOT NULL THEN
strcond := strcond || ',';
END IF;
strcond := strcond || 'apellido = myrows.apellido';
END IF;
IF myrows.nombre IS NOT NULL THEN
IF strcond IS NOT NULL THEN
strcond := strcond || ',';
END IF;
strcond := strcond || 'nombre = myrows.nombre';
END IF;
IF strcond IS NOT NULL THEN
strsql := 'update datosusuarios set ' || strcond || ' where usuario = myrows.usuario';
BEGIN
PERFORM strsql;
EXCEPTION
WHEN RAISE_EXCEPTION THEN
flag = 6;
RETURN flag;
END;
END IF;
END IF;
flag = 1;
END IF;
END LOOP;
/* delete from partyupdate; */
RETURN flag;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
From | Date | Subject | |
---|---|---|---|
Next Message | GABRIEL COLINA | 2007-01-12 18:53:32 | Re: odbc para Postgresql |
Previous Message | GABRIEL COLINA | 2007-01-12 18:48:57 | Re: Diferencias entre el driver ODBC Postgresql 7.03 y el Driver ODBC Postgresql ANSI 8.02 |