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 LeMagicien Garcimore . Évalué à 6.
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.
[^] # Re: PostgreSQL, trigger, insert & update
Posté par sToR_K . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.