Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Problemas para terminar una función PL/Pgsql

From: Damian Culotta <dculotta(at)fibertel(dot)com(dot)ar>
To: Jaime Casanova <systemguards(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Problemas para terminar una función PL/Pgsql
Date: 2007-01-16 02:35:11
Message-ID: 45AC39DF.6080600@fibertel.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Jaime Casanova escribió:
> On 1/12/07, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
>> dculotta(at)fibertel(dot)com(dot)ar escribió:
>>
>> >
>> > Me devuelve la variable strcond nula.
>> > :-(
>>
>> o inicializala a la cadena vacia antes de hacer las concatenaciones.
>>
>
> esa es la solucion... el esta inicializando strcond a NULL y luego
> cada vez que va a asignarle un valor hace strcond := strcond ||
> 'alguna_cadena' lo cual, obviamente, le va a dejar nula esa variable
>
Ya lo solucioné, sólo quería postearlo por si a alguien le sirve el ejemplo.
Muchas gracias por las colaboraciones.
Aún em falta ver un par de pequeños detalles, pero ya es funcional.

He aquí la función:

CREATE OR REPLACE FUNCTION updatedatos()
RETURNS text AS
$BODY$
DECLARE
myrows RECORD;
thisrow RECORD;
strcond VARCHAR;

flag INTEGER;

BEGIN
FOR myrows IN SELECT * FROM datosorigen LOOP
IF myrows.usuario IS NULL THEN
flag = 1;
RETURN flag;
ELSE
SELECT INTO thisrow * FROM datosusuarios WHERE usuario = myrows.usuario;
IF thisrow.usuario IS NULL THEN
BEGIN
insert into datosusuarios values
(myrows.usuario,myrows.apellido,myrows.nombre);
EXCEPTION
WHEN RAISE_EXCEPTION THEN
flag = 2;
RETURN flag;
END;
ELSE
strcond := '';
IF myrows.apellido IS NOT NULL AND myrows.apellido <> thisrow.apellido THEN
IF strcond <> '' THEN
strcond := strcond || ',';
END IF;
strcond := strcond || 'apellido = ''' || myrows.apellido || '''';
END IF;
IF myrows.nombre IS NOT NULL AND myrows.nombre <> thisrow.nombre THEN
IF strcond <> '' THEN
strcond := strcond || ',';
END IF;
strcond := strcond || 'nombre = ''' || myrows.nombre || '''';
END IF;
IF strcond <> '' THEN
BEGIN
EXECUTE 'update datosusuarios set ' || strcond || ' where usuario = '''
|| myrows.usuario || '''';
EXCEPTION
WHEN RAISE_EXCEPTION THEN
flag = 3;
RETURN flag;
END;
END IF;
END IF;
flag = 0;
END IF;
END LOOP;
/* delete from partyupdate; */
RETURN paso1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2007-01-16 05:52:44 Re: Necesito un script para hacer salva acumulativa en la BD
Previous Message Mario A Wojcik 2007-01-15 23:24:56 Re: Fw: Conexion