PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 17/01/2011 12:44:33

mrZeby
Membre

manipulation xml en plpgsql avec postgreSQL 8.3

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

#2 17/01/2011 12:59:27

Marc Cousin
Membre

Re : manipulation xml en plpgsql avec postgreSQL 8.3

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

#3 17/01/2011 13:09:24

mrZeby
Membre

Re : manipulation xml en plpgsql avec postgreSQL 8.3

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

#4 17/01/2011 15:22:35

Marc Cousin
Membre

Re : manipulation xml en plpgsql avec postgreSQL 8.3

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

#5 18/01/2011 10:17:10

mrZeby
Membre

Re : manipulation xml en plpgsql avec postgreSQL 8.3

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 smile. 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

#6 18/01/2011 14:03:01

Marc Cousin
Membre

Re : manipulation xml en plpgsql avec postgreSQL 8.3

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

Pied de page des forums