[Pgsql-ayuda] funciones...nuevamente

Alvaro Herrera alvherre@dcc.uchile.cl
Wed, 12 Nov 2003 10:08:00 -0300


On Wed, Nov 12, 2003 at 12:05:06PM +0000, GUSTAVO MARTIN OCAMPO wrote:

> Alvaro, lo que quiero hacer es un trigger que se dispare cuando hago insert 
> o update sobre una tabla y ejecute una funcion que me extraiga el año
> (o ano si no sale la eñe) de un campo tipo fecha, [...] almacenarlo en
> una tabla para despues utilizarlo.

Bueno, primero que nada EXECUTE no recibe expresiones, sólo escalares,
por lo tanto tienes que usar una variable para construir la consulta y
darle eso a EXECUTE.

Ademas, no retornes NULL sino NEW (de lo contrario no se va a insertar
el valor).

Por otra parte, no necesitas un FOR LOOP porque el trigger se ejecuta
para cada tupla.  Puedes hacer

DECLARE
	consulta TEXT;
	anno INTEGER
BEGIN
	SELECT INTO anno EXTRACT(year FROM NEW.fecha_vencimiento);
	consulta := ''INSERT INTO annos_vencimiento VALUES ('' ||
		anno || '')'';
	EXECUTE consulta;
	RETURN NEW;
END;

(sin probar, pero la idea es mas o menos esa)

Supongo que en rigor deberías guardar además un contador que diga
cuantas veces ha aparecido cada año de manera que puedas borrarlo si
llega a cero (cosa que puede pasar si haces DELETE de todos los
registros de ese año).  Queda de ejercicio para el estudiante ...
(y de paso, cuando tengas eso listo, lo contribuyes para ponerlo en el
sitio de ejemplos de pl/pgsql)

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Pido que me den el Nobel por razones humanitarias" (Nicanor Parra)