Vous n'êtes pas identifié(e).
Pages : 1
Bonsoir,
Dans un précédent topic j'avais demandé si on ne pouvait pas faire de transaction dans une procédure (fonction) PostgreSQL, et c'est alors que j'avais reçu une réponse clair et net :
PostgreSQL ne gère pas les sous-transactions et une fonction est en elle-même une transaction. Donc, non, pas possible de faire de COMMIT dans une fonction.
J'en avais déduis qu'on ne pouvais pas créer plusieurs BEGIN dans une fonction, mais en lisant la documentation officielle j'ai vu :
CREATE TABLE db (a INT PRIMARY KEY, b TEXT);
CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
$$
BEGIN
LOOP
-- first try to update the key
UPDATE db SET b = data WHERE a = key;
IF found THEN
RETURN;
END IF;
-- not there, so try to insert the key
-- if someone else inserts the same key concurrently,
-- we could get a unique-key failure
BEGIN
INSERT INTO db(a,b) VALUES (key, data);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- Do nothing, and loop to try the UPDATE again.
END;
END LOOP;
END;
$$
LANGUAGE plpgsql;
SELECT merge_db(1, 'david');
SELECT merge_db(1, 'dennis');
J'ai testé ce code et bien sur il compile, mais pourquoi et à quoi sert le BEGIN qui se trouve après le END IF ?
Je pensais qu'on ne pouvais pas créer de transaction dans une fonction, comment se fait-t-il qu'il n'y ait pas d'erreur ?
Cordialement,
Hors ligne
Ce n'est pas des instructions de transactions dans ce cas. Cela permet de créer un bloc dans le code où il sera possible d'avoir une partie de gestion des exceptions ainsi que des variables locales.
Guillaume.
Hors ligne
D'accord, je m'en doutais un peu mais je voulais être sur, merci !
PS: on aurait pu l'appeler TRY
Hors ligne
Pages : 1