Précision ?
SAS/ = 14 Janvier, 2007 - 16:03
Bonjour,
Pourriez-vous être plus précis ? Je ne comprends pas vraiment ce que vous cherchez à faire. Je ne vois en effet pas bcp de rapports entre la solution proposée et la question initiale.
Librement,
Stéphane Schildknecht
dalibo
PostgreSQLFr
[ Vous devez
vous connecter pour poster des commentaires ]
Trigger pour "UPDATE IF FOUND sinon un INSERT"
ducteil/ = 14 Janvier, 2007 - 18:59
Bonjour
En effet, mon problème peut se résoudre de deux façons :
+ soit, j'insére un nouvel élément dans un fichier, si l'élément existe déjà , le mettre à jour.
+ soit modifier un élément, si il n'existe pas le créer.
Je pense que l'on doit passer par un trigger, car la solution via une transaction avec gestion d'erreur ne semble pas fonctionner (http://traduc.postgresqlfr.org/pgsql-8.1.4-fr/sql-update.html tout en bas !).
J'espère avoir été plus clair
Cordialement
Olivier DUCTEIL
[ Vous devez
vous connecter pour poster des commentaires ]
Faire une petite fonction psq
sparky/ = 15 Janvier, 2007 - 11:51
Faire une petite fonction psql avec un parametre de type rowtype%TABLE
exemple
-- existe ??
select count(*) into nCount from TABLE where cond
if count = 0 then
-- n'existe pas, je fais insert
else
-- existe je fais update
end if
[ Vous devez
vous connecter pour poster des commentaires ]
Le Trigger ne donne pas de résultat...
ducteil/ = 16 Janvier, 2007 - 02:16
Bonjour
J'ai bien compris la mécanique (if then else) mais pratiquement je n'y arrive pas.
-----
--DROP TABLE matable;
CREATE TABLE matable
(
date date NOT NULL,
heure time,
titre char(50),
texte text,
CONSTRAINT date_matable PRIMARY KEY (date)
);
CREATE OR REPLACE FUNCTION mise_a_jour() RETURNS "trigger" AS
$BODY$
DECLARE
matable_ligne matable%ROWTYPE;
BEGIN
SELECT * INTO matable_ligne FROM matable WHERE date = NEW.date;
IF (matable_ligne == null) THEN
INSERT INTO matable VALUES (NEW.date,NEW.heure, NEW.titre, NEW.texte);
RETURN NULL;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
CREATE TRIGGER trigger_matable BEFORE UPDATE ON matable FOR EACH ROW EXECUTE PROCEDURE mise_a_jour();
--- On exécute la procédure ----
UPDATE matable SET date='07-04-2006', titre='nouveau titre', texte='mon texte++--',heure='00:00:00' WHERE date='07-04-2006';
--- On vérifie ----
SELECT * FROM matable;
-----
Pas d'enregistrement effectué... je ne vois pas pourquoi.
Cordialement
Olivier DUCTEIL
[ Vous devez
vous connecter pour poster des commentaires ]
Oui l'erreur est ici
sparky/ = 16 Janvier, 2007 - 13:01
Oui l'erreur est ici
SELECT * INTO matable_ligne FROM matable WHERE date = NEW.date;
IF (matable_ligne == null) THEN
INSERT INTO matable VALUES (NEW.date,NEW.heure, NEW.titre, NEW.texte);
soit tu fais
if matable_ligne is NULL Then ...
soit tu fais
if FOUND = False then
Attention plpgsql^n'est pas du C, donc pas de double = pour les tests, ni pas de parenthèse ;-)
Je préfère faire un count, ça marchera même sur une 7 :-)
[ Vous devez
vous connecter pour poster des commentaires ]
Le Trigger UPDATE => INSERT
ducteil/ = 18 Janvier, 2007 - 18:05
Bonjour
Je n’ai toujours aucun ajout après mon update.
1 - Est-ce les « NEW.*» ne changent pas de valeur après le SELECT de la procédure ?
Dans ce cas, ils seront tous NULL, pour l'insertion suivante.
2 - Est-ce que la procédure "comprend" bien que c'est la table 'matable' et non une variable "locale" qu'il faut affecter après un INSERT INTO ?
3 - Peut-on modifier la table sur laquelle s'exécute le trigger ?
Les modifs
(...)
DECLARE
matable_ligne matable%ROWTYPE;
BEGIN
SELECT * INTO matable_ligne FROM matable WHERE date = NEW.date;
IF matable_ligne IS NULL THEN
INSERT INTO matable VALUES (current_date,NEW.heure, NEW.titre, NEW.texte);
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;
(...)
J'ai mis « current_date » à la place de « NEW.date » en cas où ma première assertion soit vraie.
[NB : Merci pour le temps passé à la résolution de ce problème]
Cordialement
Olivier
http://www.2amath.fr
[ Vous devez
vous connecter pour poster des commentaires ]
Tu sais, je pense Ă un truc:
sparky/ = 19 Janvier, 2007 - 12:39
Tu sais, je pense à un truc: tu fais update before, or l'update ne sera jamais éxécuté pour la simple raison qu'il n'y a aucune ligne à updater, le mieux alors d'utiliser les rules ou de passer par une fonction
voir ici http://docs.postgresqlfr.org/pgsql-8.1.6-fr/sql-createrule.html
Pourrais utiliser raise notice
exemple :
DECLARE
matable_ligne matable%ROWTYPE;
BEGIN
SELECT * INTO matable_ligne FROM matable WHERE date = NEW.date;
IF matable_ligne IS NULL THEN
raise notice 'Aucune ligne trouvée on fait insert';
INSERT INTO matable VALUES (current_date,NEW.heure, NEW.titre, NEW.texte);
RETURN NULL;
ELSE
raise notice 'ligne trouvée on fait un update';
RETURN NEW;
END IF;
END;
[ Vous devez
vous connecter pour poster des commentaires ]