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.