Vous n'êtes pas identifié(e).
Pages : 1
Bonjour tout le monde...
Je suis développeur logiciel sur un logiciel utilisant une base de données postgreSQL 8.3.
Je cherche à mettre au point une fonction trigger en plpgsql qui récupère un champ de type texte mais dont le contenu est du xml dont j'ai besoin de vérifier une donnée pour valider ou non l'enregistrement des modifications.
Peut-on et si oui comment, en plpgsql passer d'un texte à du xml dont je pourrais récupérer les données ?
Il me semble avoir lu dans la doc postgreSQL qu'il fallait utiliser/configurer libxml ? comment le faire sur une base existante ?
merci d'avance pour vos réponses...
Hors ligne
Pour commencer, le chapitre de la doc associé:
http://docs.postgresql.fr/8.3/datatype-xml.html
Donc oui, pour xml, il faut que la libxml soit installée, et que le moteur soit compilé avec --with-libxml
Si ce n'est pas le cas (ça dépend de comment vous avez installé, et de quel est votre système d'exploitation), il faudra recompiler.
Ensuite, si c'est le cas, vous avez un type XML. Comme indiqué dans la doc, vous avez ce qu'il faut pour passer de texte à xml (xmlparse) et vice versa.
Par ailleurs, il y a eu beaucoup d'améliorations dans le support de XML dans la version 8.4, de mémoire.
Marc.
Hors ligne
merci pour la réponse si rapide...
il me vient une autre question du coup... pour l'utilisation de libxml, vous dites qu'il faut recompiler ??? c'est à dire récupèrer directement les sources de postgreSQL pour les recompiler pour ensuite réinstaller postgreSQL ?... ou bien vous entendez autre chose par recompiler ?
Le logiciel est installé sous sous windows xp et 7.
Hors ligne
Non, comme vu sur irc: comme c'est du windows, recompiler, c'est un cauchemar.
Reste à déterminer si xml est compilé, sous PostgreSQL, sous Windows. Quel installeur avez vous utilisé ?
Marc.
Hors ligne
Bonjour,
voici un petit résumé de mon état d'avance (au cas ou quelqu'un souhaiterait répondre à la même problèmatique que moi)
J'ai mis en place une fonction trigger permettant de valider la modification d'un champ avant son enregistrement dans un table d'une base de données PostgreSQL 8.3.6 installée à partir du package de binaires Windows téléchargé sur le site http://www.postgresql.org. Cette installation se fait par défaut avec le module libxml de configuré ce qui permet un certain nombre de manipulation 'xml'.( libxml2 n'est pas configuré ).
Le champ en question est de type texte mais contient des données formatées en XML.
Il me faut tester la valeur 'donnée4' qui est une chaine dans un champ de la forme :
<... entete XML configuré en UTF 16...>
<rootNode>
<balise1>
<balise11>donnée1 </balise11>
<balise12>donnée2 </balise12>
</balise1>
<balise2>
<balise21>donnée3 </balise21>
<balise22>donnée4 </balise22>
</balise2>
</rootNode>
le code résumé de cette fonction est le suivant :
DECLARE
maVariableXML xml;
monChampTEXTE text;
BEGIN
IF (TG_OP = 'UPDATE') THEN
IF OLD.ChampTextContenantDesDonnéesXML <> NEW.ChampTextContenantDesDonnéesXML
maVariableXML := XMLPARSE(DOCUMENT NEW.ChampTextContenantDesDonnéesXML);
monChampTEXTE := xpath('/rootNode/balise2/balise22/text()',maVariableXML);
-- ici monChampTEXTE contient {donnée4} avec les accolades --
IF monChampTEXTE..... THEN
.... ensemble de traitement
END IF;
RETURN NEW;
END IF;
END IF;
END;
C'est déjà pas mal... maintenant si j'arrivais à récupérer donnée4 sans les accolades, je serais le roi du monde . Je continu donc à chercher l'éventuel paramètre à passer à la fonction xpath pour ne pas avoir à bricoler la chaine reçue.
En espérant avoir été clair,
je remercie toutes les personnes m'ayant donné un coup de main à dégrossir le problème car je partais de ZERO.
Hors ligne
Les accolades, c'est parce que le résultat est un tableau (vous pourriez avoir plusieurs valeurs correspondant au xpath). Il vous reste donc juste à récupérer le premier élément du tableau…
http://docs.postgresql.fr/9.0/arrays.html
(il faut mettre un [0] à la fin je pense)
Marc.
Hors ligne
Pages : 1