IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Trigger pour formater des dates avant insertion


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2010
    Messages : 59
    Par défaut Trigger pour formater des dates avant insertion
    Bonjour à tous,
    ça va faire 4 heures que je me casse les dents sur un trigger avec Postgresql...

    J'ai besoin de transformer des données mal formatées avant insertion, j'ai donc crée un trigger de type BEFORE INSERT que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    CREATE OR REPLACE FUNCTION delais_traitement() RETURNS trigger AS $$
        BEGIN
            -- On verifie si l'entree existe deja
            IF EXISTS (SELECT 1 FROM graph_activite WHERE "num_demande" = NEW."num_demande" AND "chapitre" = NEW."chapitre") THEN
                RETURN NULL;
            END IF;
     
            -- On formate toutes les donnees de type date
            NEW.dateheure_val_bio := to_timestamp(NEW.dateheure_val_bio,'DDMMYYHH24MI')::timestamp without time zone;
            NEW.heure_val_bio := date_part('hour', NEW.dateheure_val_bio);
            NEW.heure_val_tec := date_part('hour', NEW.dateheure_val_tec);
            NEW.dateheure_val_pvt := to_timestamp(NEW.dateheure_val_pvt,'DDMMYYHH24MI')::timestamp without time zone;
            NEW.heure_val_pvt := date_part('hour', NEW.dateheure_val_pvt);
            NEW.jour_pvt := date_part('dow', NEW.dateheure_val_pvt);
     
            -- On recupere le type de chapitre
            NEW.chapitre := (SELECT type FROM chapitre WHERE code_chapitre = NEW.chapitre);
     
            RETURN NEW;
        END;
    $$ LANGUAGE plpgsql;
     
    -- Creation du trigger
    CREATE TRIGGER delais_traitement BEFORE INSERT ON graph_activite
    FOR EACH ROW EXECUTE PROCEDURE delais_traitement();
     
    -- Test d'une insertion
    INSERT INTO graph_activite(num_demande, code_labo, code_corr, chapitre, code_exam, code_pvt, ope_val_bio, dateheure_val_bio, ope_val_tec, dateheure_val_tec, dateheure_val_pvt) 
    VALUES('B30507O7506', 'O', 'XO', 'BIONI', '1GLYF', 'OGOTH', 'PGOTH', '0705131652', 'BgVal', '0705130730', '2013-05-07 16:52:13');
    L'erreur retournée :

    Erreur SQL :

    ERROR: invalid input syntax for type timestamp: "0705131652"
    LINE 2: ...', 'O', 'XO', 'BIONI', '1GLYF', 'OGOTH', 'PGOTH', '070513165...

    Donc d'après cette erreur, Postgres analyse le type de la donnée entrée avant même le déclenchement du trigger ?
    Comment faire pour insérer une valeur '070513165' qui sera un beau timestamp en BDD ?

    Merci d'avance !

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Effectivement la vérification de cohérence par rapport au type intervient avant le trigger puisque les champs de NEW sont déjà typés. Dans le cas contraire, il ne serait pas possible de faire des opérations sur ces champs dans le trigger et ce serait trop contraignant.

    Il faudrait mettre le bon format en amont ou bien insérer dans une table intermédiaire dont les champs sont de type text et que le trigger fasse l'insertion dans la table finale.

Discussions similaires

  1. Trigger pour vider une table avant insertion
    Par renardchan dans le forum Requêtes
    Réponses: 4
    Dernier message: 17/01/2011, 15h41
  2. insertion des dates avant 1/1/1900
    Par sacha2007 dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 18/03/2008, 00h01
  3. [MySQL] le format idéal pour stocker des dates avec l'heure
    Par Philoulheinz dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/02/2007, 21h53
  4. Format des dates pour acces à une BD MS Access..
    Par hagler dans le forum Bases de données
    Réponses: 10
    Dernier message: 03/10/2005, 18h16
  5. [C#] Format des dates pour une ComboBox...
    Par frechy dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/01/2005, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo