Problemas para terminar una función PL/Pgsql

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;

Responses

Browse pgsql-es-ayuda by date

  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