Thread: problem with function trigger
<br /><br /><font face="sans-serif" size="2">Hi I'm trying to update a table column with a pl/pgsql function and a trigger.</font><br /><font face="sans-serif" size="2">But I didn't managed to make it work so far.</font><br /><br /><fontface="sans-serif" size="2">Here's my function code :</font><br /><br /><font face="sans-serif" size="2">CREATE FUNCTIONpublic.calcul_impact() RETURNS opaque AS '</font><br /><br /><font face="sans-serif" size="2">DECLARE </font><br/><font face="sans-serif" size="2">id_line integer;</font><br /><font face="sans-serif" size="2">quantity integer;</font><br/><font face="sans-serif" size="2">single_price real; </font><br /><font face="sans-serif" size="2">total_costreal; </font><br /><font face="sans-serif" size="2">amort integer;</font><br /><font face="sans-serif"size="2">month integer;</font><br /><font face="sans-serif" size="2">impact real;</font><br /><br /><fontface="sans-serif" size="2">BEGIN </font><br /><br /><font face="sans-serif" size="2">SELECT INTO id_line id_line_tableFROM table WHERE id_line_table = NEW.id_line;</font><br /><font face="sans-serif" size="2">SELECT INTO single_pricesingle_price_previ FROM table WHERE id_line_table = NEW.id_line;</font><br /><font face="sans-serif" size="2">SELECTINTO total_cost total_cost_previ FROM table WHERE id_line_table = NEW.id_line;</font><br /><font face="sans-serif"size="2">SELECT INTO quantity quantity_previ FROM table WHERE id_line_table = NEW.id_line;</font><br /><fontface="sans-serif" size="2">SELECT INTO amort amortis FROM table WHERE id_line_table = NEW.id_line;</font><br /><fontface="sans-serif" size="2">SELECT INTO month month_previ FROM table WHERE id_line_table = NEW.id_line;</font><br /><fontface="sans-serif" size="2">SELECT INTO impact impact_previ FROM table WHERE id_line_table = NEW.id_line;</font><br/><br /><font face="sans-serif" size="2">IF(quantity IS NULL OR single_price IS NULL) THEN impact:=0; </font><br /><font face="sans-serif" size="2">ELSE IF(quantity >= 12) THEN impact:= (total_cost / amort); </font><br/><font face="sans-serif" size="2"> ELSE IF(quantity < 12 AND single_price <= 500) THEN impact:= total_cost;</font><br /><font face="sans-serif" size="2"> ELSE IF(quantity < 12 AND single_price > 500) THENimpact:= ((12 - month)*(total_cost/(amort*12))); </font><br /><font face="sans-serif" size="2"> END IF;</font><br/><font face="sans-serif" size="2"> END IF;</font><br /><font face="sans-serif" size="2"> END IF;</font><br/><font face="sans-serif" size="2">END IF;</font><br /><br /><font face="sans-serif" size="2">IF (TG_OP =''INSERT''OR TG_OP=''UPDATE'') THEN </font><br /><font face="sans-serif" size="2"> UPDATE table SET impact_previ= impact WHERE id_line_table = NEW.id_line; </font><br /><font face="sans-serif" size="2">END IF; </font><br/><br /><font face="sans-serif" size="2">RETURN NEW; </font><br /><br /><font face="sans-serif" size="2">END;</font><br/><br /><font face="sans-serif" size="2">' LANGUAGE 'plpgsql';</font><br /><br /><font face="sans-serif"size="2">CREATE TRIGGER add_impact_previ BEFORE INSERT OR UPDATE ON public.budget FOR EACH ROW EXECUTE PROCEDUREcalcul_impact();</font><br /><br /><font face="sans-serif" size="2">I always get the error :</font><br /><br /><fontface="sans-serif" size="2">Error SQL :</font><br /><font face="sans-serif" size="2">ERROR: record "new" has no fieldnamed "id_ligne"</font><br /><br /><font face="sans-serif" size="2">Has anyone an idea about what's wrong ?</font><br/><br /><font face="sans-serif" size="2">thanks for answering me</font><br />
> > Hi I'm trying to update a table column with a pl/pgsql function and a > trigger. > But I didn't managed to make it work so far. > > Here's my function code : > > CREATE FUNCTION public.calcul_impact() RETURNS opaque AS ' > > DECLARE > id_line integer; > quantity integer; > single_price real; > total_cost real; > amort integer; > month integer; > impact real; > > BEGIN > > SELECT INTO id_line id_line_table FROM table WHERE id_line_table = > NEW.id_line; > SELECT INTO single_price single_price_previ FROM table WHERE id_line_table > = NEW.id_line; > SELECT INTO total_cost total_cost_previ FROM table WHERE id_line_table = > NEW.id_line; > SELECT INTO quantity quantity_previ FROM table WHERE id_line_table = > NEW.id_line; > SELECT INTO amort amortis FROM table WHERE id_line_table = NEW.id_line; > SELECT INTO month month_previ FROM table WHERE id_line_table = > NEW.id_line; > SELECT INTO impact impact_previ FROM table WHERE id_line_table = > NEW.id_line; > > IF(quantity IS NULL OR single_price IS NULL) THEN impact:= 0; > ELSE IF(quantity >= 12) THEN impact:= (total_cost / amort); > ELSE IF(quantity < 12 AND single_price <= 500) THEN impact:= > total_cost; > ELSE IF(quantity < 12 AND single_price > 500) THEN impact:= ((12 > - month)*(total_cost/(amort*12))); > END IF; > END IF; > END IF; > END IF; > > IF (TG_OP =''INSERT'' OR TG_OP=''UPDATE'') THEN > UPDATE table SET impact_previ = impact WHERE id_line_table = > NEW.id_line; > END IF; > > RETURN NEW; > > END; > > ' LANGUAGE 'plpgsql'; > > CREATE TRIGGER add_impact_previ BEFORE INSERT OR UPDATE ON public.budget > FOR EACH ROW EXECUTE PROCEDURE calcul_impact(); > > I always get the error : > > Error SQL : > ERROR: record "new" has no field named "id_ligne" > > Has anyone an idea about what's wrong ? > > thanks for answering me Could you please show the definition of table "budget". Not sure what you're trying to achieve by these SELECT INTO ... statements. Regards, Christoph