Re: PostgreSQL9.1 trigger avec arguments

From: François Figarola <francois(dot)figarola(at)i-consult(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: PostgreSQL9.1 trigger avec arguments
Date: 2012-11-29 16:38:45
Message-ID: 50B78F95.3010208@i-consult.fr
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonjour Martine,

En fait, normalement vous avez directement accès aux colonnes de la table
dans la fonction trigger via la variable automatique NEW, ce qui permet
d'éviter
de lui passer les paramètres, et de ce fait écrire directement quelque
chose du
genre :

CREATE FUNCTION "public"."fct_calcul_duree"()
RETURNS TRIGGER
LANGUAGE plpgsql
VOLATILE
AS
$$
BEGIN
IF NEW.date_fin IS NOT NULL THEN
NEW.duree := NEW.date_fin - NEW.date_debut;
END IF;
RETURN NEW;
END
$$

...

CREATE TRIGGER "trigger_calcul_duree"
BEFORE INSERT OR UPDATE ON "public"."t_projet"
FOR EACH ROW
EXECUTE PROCEDURE "public"."fct_calcul_duree"();

Espérant que celà puisse aider.

Cordialement.

Le 29/11/2012 17:06, Martine AGUERA a écrit :
> Bonjour,
>
> Je bloque sur le passage d’arguments au niveau des Triggers.
>
> J’ai plusieurs tables où je dois calculer la durée entre deux dates,
> pour cela je souhaiterais créer une fonction trigger unique à toutes
> les tables en passant en paramètre la date de début et la date de fin.
>
> Ce qui est curieux c’est qu’on ne peut passer que des arguments de
> type chaîne ?
> J’ai donc converti les valeurs de type date en chaine de caractères
> avant le passage des paramètres et fait l’opération inverse pour
> calculer la durée.
>
> Vous trouverez ci-dessous mon code et l’erreur générée.
> Merci de votre aide
> Martine
>
> ------------------------------------------
> CREATE FUNCTION "public"."fct_calcul_duree"()
> RETURNS TRIGGER
> LANGUAGE plpgsql
> VOLATILE
> AS
> $$
> DECLARE
> arg_date_debut varchar;
> arg_date_fin varchar;
>
> BEGIN
> arg_date_debut := TG_ARGV[0];
> arg_date_fin := TG_ARGV[1];
>
> NEW.duree := to_date(arg_date_fin, 'YYYY-MM-DD') -
> to_date(arg_date_debut, 'YYYY-MM-DD');
>
> RETURN NEW;
> END
>
> $$
> ;CREATE TABLE "public"."t_projet"(
> "projet_id" Serial NOT NULL,
> "nom" Varchar NOT NULL,
> "reference" Varchar NOT NULL,
> "objectifs_scientifiques" Varchar,
> "date_debut" Date NOT NULL,
> "date_fin" Date,
> "duree" Integer,
> "observations" Varchar,
> "test" Varchar,
> CONSTRAINT "check_date" CHECK ((date_fin > date_debut))
> )
> WITH (OIDS=FALSE)
>
> CREATE TRIGGER "trigger_calcul_duree"
> BEFORE INSERT OR UPDATE OF date_debut, date_fin
> ON "public"."t_projet" FOR EACH ROW
> WHEN (NEW.date_fin is not null)
> EXECUTE PROCEDURE
> "public"."fct_calcul_duree"(to_char(NEW.date_debut,'YYYY-MM-DD'),
> to_char(NEW.date_fin, 'YYYY-MM-DD'))
> ;
>
> ---------------------------
> [WARNING ] CREATE TRIGGER "trigger_calcul_duree"
> BEFORE INSERT OR UPDATE OF date_debut, date_fin
> ON "public"."t_projet" FOR EACH ROW
> WHEN (NEW.date_fin is not null)
> EXECUTE PROCEDURE
> "public"."fct_calcul_duree"(to_char(NEW.date_debut,'YYYY-MM-DD'),
> to_char(NEW.date_fin, 'YYYY-MM-DD'))
> ERREUR: erreur de syntaxe sur ou près de « ( »
> LINE 5: ...CUTE PROCEDURE
> "public"."fct_calcul_duree"(to_char(NEW.date_...
> --------------------------------
>
>
>
>

--
François Figarola
-- développeur --
=================
INTERNET CONSULT
Mas Guerido
6 rue Aristide Bergès
66330 CABESTANY

Tel 04.68.66.09.29
fax 04.68.66.99.50
* francois(dot)figarola(at)i-consult(dot)fr

In response to

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Cédric Villemain 2012-11-30 08:43:41 Re: Appel à Candidature pour l'organisation du PG Day France 2013
Previous Message Martine AGUERA 2012-11-29 16:06:50 PostgreSQL9.1 trigger avec arguments