Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/08/2007, 08h52   #1
Invité de passage
 
Inscription : mai 2005
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 15
Points : 3
Points : 3
Par défaut Annulation d'enregistrements provenant de sous fonctions

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 :
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.
matmuth est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h31.


 
 
 
 
Partenaires

Hébergement Web