Bonjour,

Je suis en train de développer une application sous postgresSQL 8.1.

Afin d'avoir des fonctions réutilisables, j'ai décidé d'avoir des fonctions de bases, qui inséraient dans une seule table, et des fonctions parents, qui faisaient appel à ces fonctions. Une question s'est présentée à moi : Est-il possible de réaliser un RollBack sur une fonction parent, qui annulerait chaque enregistrement des fonctions de bases. J'ai vu que begin et end ouvrait et fermait leur transation, ce qui m'inquiete quant à la faisabilité de ma demande...

Voici la code que j'utilise :
Fonction parent : ajout_contact
Fonction de base : add_adresse & add_contact.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
CREATE OR REPLACE FUNCTION "public"."ajout_contact" (params text) RETURNS SETOF "public"."typeret" AS
$body$
declare
        paramstemp text;
        resultaddadr public.typeret;
        resultaddcont public.typeret;
 
begin
 
    -- on appelle la fonction add_adresse pour ajouter les données dans la table adresse, en précisant qu'elle n'est pas obligatoire
    for resultaddadr in select * from add_adresse(params, false) loop
 
        if(resultaddadr.nouveau <> false) or (resultaddadr.nouveau <> null) then
        -- on ajoute le noeud idadr dans le xml
           paramstemp := addxmlnodewithparentnode(params, 'PARAMETRE', resultaddadr.id, 'name="idadr" type="integer"', 'PARAMETRES');
        else
           paramstemp := params;
        end if;
 
            -- on appelle la fonction add_contact pour ajouter les données dans la table contact
            for resultaddcont in select * from add_contact(paramstemp) loop
                return next resultaddcont;
            end loop;
    end loop;
 
exception
when raise_exception then
    rollback;
 
when others then
begin      
      generatedmsg := generate_message( 'MESSAGEERREUR', SQLERRM, 'HAUTE', 'Insertion impossible');
      select into enreg generatedmsg as messageinfo,
      null as selected,
      null as id,
      null as valeur,
      null as nouveau;
          return next enreg;  
end;
 
end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
 
---------------------------------------------------------------------------------------------------
 
CREATE OR REPLACE FUNCTION "public"."add_contact" (params text) RETURNS SETOF "public"."typeret" AS
$body$
declare
    enreg public.typeret;
    idnewcont integer;
 
begin
 
    insert into contact ( Champ1, Champ2) values ( Val1, Val2);
    idnewcont := currval('contact_idcont_seq'::regclass);
    select 'OK', null, idnewcont, null, true
           into enreg;
 
    --on retourne l'identifiant du contact inséré
    return next enreg;
 
end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
Voici ma question : comment, en cas d'erreur d'insertion dans ma commande add_contact, je puis annuler l'insertion de la table adresse? Ici il n'y a que 2 fonctions, mais dans certains cas complexe, il y en a 5, et je ne me vois pas faire des DELETE à la main...
D'avance merci,
Jérémy.