Vous n'êtes pas identifié(e).

#1 12/11/2012 21:18:05

guk92
Membre

Deux BEGIN dans une fonction

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 :

gleu a écrit :

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

#2 12/11/2012 23:25:17

gleu
Administrateur

Re : Deux BEGIN dans une fonction

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

#3 13/11/2012 08:28:44

guk92
Membre

Re : Deux BEGIN dans une fonction

D'accord, je m'en doutais un peu mais je voulais être sur, merci !

PS: on aurait pu l'appeler TRY wink

Hors ligne

Pied de page des forums