Journal PostgreSQL, trigger, insert & update

Posté par  .
Étiquettes : aucune
0
4
juin
2003
Pour une application, je voudrais éviter les requetes SQL type "INSERT" et "UPDATE". Pour ça, je voudrais créer un trigger qui commence par faire un INSERT et si cet INSERT échoue pour cause de duplication de clé primaire, qu'il effectue un UPDATE.
Le problème c'est que j'y connais rien en plpgsql, si quelqu'un a de la doc (bien faite), eventuellement une fonction équivalente sur laquelle je peux me baser...
  • # Re: PostgreSQL, trigger, insert & update

    Posté par  . Évalué à 6.

    allez hop :

    CREATE FUNCTION insert_tuple() RETURNS TRIGGER
    AS '
    DECLARE nb_tuple INTEGER;
    DECLARE query VARCHAR(400);
    BEGIN
    SELECT INTO nb_tuple COUNT(*) FROM table WHERE id1 = new.id1 AND id2 = new.id2;
    IF nb_tuple > 0 THEN
    query := ''UPDATE table SET val = '' || new.val || '' WHERE id1 = '' || new.id1 || '' AND id2 = '' || new.id2 || '';'';
    RAISE NOTICE ''update tuple : %'', query;
    EXECUTE query;
    RETURN NULL;
    END IF;
    RAISE NOTICE "tuple inserted";
    RETURN new;
    END;'
    LANGUAGE 'plpgsql';

    CREATE TRIGGER trigger_name
    BEFORE INSERT ON table
    FOR EACH ROW
    EXECUTE PROCEDURE insert_tuple();


    NB : '' <- c'est pas des doubles quotes, mais deux simples quotes :)
    Pas testé,, mais ca devrait rouler.
    Désolé pour l'indentation :|

    Les triggers sur before peuvent retourner null pour anuler la suite du process (insertion , suppression,...)
    les || servent à concatener les chaînes.
    Le truc lourd dans plsql, c'est les quotes. PLus d'infos ici : http://www.postgresql.org/docs/view.php?version=7.3&idoc=0&(...)

    Pour une doc complète :
    http://www.postgresql.org/docs/view.php?version=7.3&idoc=0&(...)

    A plus.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.