Raúl Andrés Duque escribió:
> Damina qué es es "RETURN paso1"
>
> Atentamente,
>
> RAUL DUQUE
> Bogotá, Colombia
>
> ----- Original Message -----
> *From:* Damian Culotta <mailto:dculotta(at)fibertel(dot)com(dot)ar>
> *To:* Jaime Casanova <mailto:systemguards(at)gmail(dot)com>
> *Cc:* pgsql-es-ayuda(at)postgresql(dot)org
> <mailto:pgsql-es-ayuda(at)postgresql(dot)org>
> *Sent:* Monday, January 15, 2007 9:35 PM
> *Subject:* [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re:
> [pgsql-es-ayuda] Problemas para terminar una función PL/Pgsql
>
> 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;
>
>
Perdón, ahi se me escapó.
Era una variable que estaba usando para control.
Debería ser: RETURN flag para este caso. Flag estaba devolviendome en
que estado había quedado (probando con un registro, no sirve como
control real. (Al menos no así).