| From: | MoNiLlO <monillo(at)adinf(dot)es> | 
|---|---|
| To: | pgsql-sql(at)postgresql(dot)org | 
| Subject: | Control reached end of trigger procedure without RETURN | 
| Date: | 2011-01-22 06:32:27 | 
| Message-ID: | 397A0940-896A-4DEF-873A-907976E8400B@adinf.es | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-sql | 
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
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Jasen Betts | 2011-01-22 08:53:40 | Re: Issue with postgres connectivity | 
| Previous Message | Edward W. Rouse | 2011-01-21 14:47:29 | Re: Issue with postgres connectivity |