Vous n'êtes pas identifié(e).

#1 Re : Général » [Aide] Ecriture d'une fonction "simple" » 05/06/2009 14:47:05

Marc Cousin a écrit :

Une fois par base uniquement.

A la bonne heure !

Merci beaucoup !

#2 Re : Général » [Aide] Ecriture d'une fonction "simple" » 05/06/2009 12:28:25

J'ai remodifié ma requête comme ceci:

CREATE LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION P_HISTO_MESURE() RETURNS trigger AS $$
DECLARE 
  curtime TIMESTAMP WITH TIME ZONE;
BEGIN
  INSERT INTO h_mesure (
    id,
    valeur,
    date_historique)
   VALUES (
    NEW.id,
    NEW.valeur,
    curtime);
END;
$$ LANGUAGE 'plpgsql';

Et ça fonctionne (enfin) \o/.

Par contre, une question supplémentaire, doit-on à chaque script faire le CREATE LANGUAGE, ou une fois que c'est fait dans la base il n'y a plus besoin de le faire ?

#3 Re : Général » [Aide] Ecriture d'une fonction "simple" » 05/06/2009 12:01:36

Bonjour,

Merci pour votre réponse.
J'ai donc modifié ma fonction comme suis:

CREATE OR REPLACE FUNCTION p_histo_table() RETURNS trigger AS $$
DECLARE 
  curtime TIMESTAMP WITH TIME ZONE;
BEGIN
  INSERT INTO h_table (
    id,
    valeur,
    date_historique)
   VALUES (
    NEW.id,
    NEW.valeur,
    curtime)
  RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

Et là j'ai l'erreur:

ERREUR:  le langage « plpgsql » n'existe pas
HINT:  Utiliser CREATE LANGUAGE pour charger le langage dans la base de données.

********** Erreur **********

ERREUR: le langage « plpgsql » n'existe pas
État SQL :42704
Astuce : Utiliser CREATE LANGUAGE pour charger le langage dans la base de données.

Ce qui est assez étrange puisque d'après la doc ce langage semble être intégré dans le gbd...
J'ai une version 8.3.7 de PostGre, et je lance mon script avec pgAdmin III 1.8.4

#4 Général » [Aide] Ecriture d'une fonction "simple" » 05/06/2009 10:40:36

Djab
Réponses : 9

Bonjour,

Je suis complètement nouveau dans l'utilisation de PostgreSQL (et de BD de manière général), j'aimerai mettre en place un trigger pour créer une table d'historique (h_table) d'une autre table (table).

Donc voici le code de mon trigger:

CREATE TRIGGER t_histo_table AFTER INSERT OR UPDATE
    ON table FOR EACH ROW
    EXECUTE PROCEDURE p_histo_table();

et voici la fonction associée:

CREATE OR REPLACE FUNCTION p_histo_table() RETURNS NULL AS $$
  INSERT INTO h_table (
    id,
    valeur,
    date_historique)
   SELECT
    id,
    valeur,
    sysdate
   FROM table 
   WHERE id = NEW.id;
$$ LANGUAGE SQL;

Or dans pgAdminIII quand je cherche à déclarer ma fonction (avant le trigger biensur) il me renvoie l'erreur suivante:

ERREUR:  erreur de syntaxe sur ou près de « AS »
LINE 1: ...EATE OR REPLACE FUNCTION P_HISTO_MESURE() RETURNS NULL AS $$
                                                                  ^

********** Erreur **********

ERREUR: erreur de syntaxe sur ou près de « AS »
État SQL :42601
Caractère : 58

Est-ce que vous avez une idée de pourquoi ça ne fonctionne pas ?
Qu'elle est mon erreur de syntaxe ?
D'avance merci.

Pied de page des forums

Propulsé par FluxBB