Buenos días:

        Tengo una función que se dispara en un trigger cuya finalidad es; crear 
un registro en otra tabla o actualizarlo y devolviendo el id del registro 
creado/modificado para guardarlo en la tabla desde la que se llama. Intentaré 
explicarlo mejor:

tablaA --> Es la que dispara el trigger y en la que quiero guardar el id del 
registro modificado / creado en la tabla B.
tablaB --> Digamos que es una tabla resumen de la tablaA y se mantiene desde el 
trigger de la misma, creando modificando y/o borrando los registros.

Finalidad --> Eso, actualizar la tablaB desde la A y guardar en el registro de 
de la tablaA a que registro de la tablaB "pertenece".

Cuando hago el insert me devuelve el error del asunto 

Control reached end of trigger procedure without RETURN

y me indica la línea correspondiente al INSERT.
¿Acaso no continúa el flujo if (not found) y debería  hacer el return NEW tras 
el insert? ¿y lo mismo en el update del exception?

Agradezco de antemano vuestro tiempo y ayudas.

Un saludo.


P.D. Estructura de la función.


DECLARE
        id_tablaB       integer;        -- Id de la tabla B.
BEGIN
        IF (TG_OP = 'DELETE') THEN
                -- Descontar valores

        ELSIF (TG_OP = 'UPDATE') THEN
                -- Modificar valores.

        ELSIF (TG_OP = 'INSERT') THEN
                -- Asignar valores

        END IF;

        -- Update con nuevos valores y retornamos el id para actualizar detalle.
        UPDATE  tablaB
        SET     campo1=valor1,
                campo2=valor2
        WHERE   tablaA_id=NEW.tblaB_id 
        RETURNING tablaB_id INTO id_tablaB;

        -- Si no existe, hacemos el insert y retornamos el id para actualizar 
detalle.
        IF (NOT FOUND) THEN
                BEGIN           -- No existÌa el registro y lo creamos.

--
-- AQUÍ DEVUELVEL EL ERROR.
--
                        INSERT INTO     tablaB (
                                        campo1, 
                                        campo2)
                        VALUES          ( valor1,
                                        valor2 )
                        RETURNING       tablaB_id INTO id_tablaB;
                        
                EXCEPTION       
                WHEN UNIQUE_VIOLATION THEN
                        UPDATE  tablaB
                        SET     campo1=valor1,
                                campo2=valor2
                        WHERE   tablaA_id=NEW.tblaB_id 
                        RETURNING tablaB_id INTO id_tablaB;
                END;
        END IF;

        -- Borrado de ventas_imp si el resumen del % y factura es 0.
        DELETE FROM     tablaB 
        WHERE           tablaA_id=id_tablaA AND (campo3=0 OR campo3 IS NULL);

        -- Guardamos el id de la tabla ventas_imp y retornamos el record 
modificado.
        NEW.tablaB_id := id_tablaB
        return NEW;
END



-- 
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql

Reply via email to