Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
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 26/08/2011, 22h51   #1
Invité de passage
 
Florian
Responsable SIG
Inscription : août 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Florian
Localisation : Etats-Unis

Informations professionnelles :
Activité : Responsable SIG
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : août 2011
Messages : 2
Points : 0
Points : 0
Par défaut remplacer un paragraphe (xml)

Bonjour,

J'ai une base de données sous postgres (les réponses sur les autres sgbd peuvent aussi être interessante), un champ stocke des informations en xml.
Je souhaite remplacer (et/ou ajouter, supprimer) un certain nombre de valeurs que l'on peut définir comme des paragraphes entre plusieurs balises.

les requêtes de type :
Code :
1
2
3
UPDATE matable 
SET colonne = REPLACE(colonne,'paragraphe recherché','nouveau paragraphe')
WHERE condition;
ne fonctionne pas....

Pour plus de précision, mon paragraphe est de la forme :

<balise1>
<balise2>
blabla
</balise2>
<balise2b>
blablabla
</balise2b>
</balise1>
Les éléments de mise en forme du xml doivent y être pour quelque chose...

J'ai testé seulement la recherche, et pour avoir un résultat valable j'ai du transformer mon paragraphe de la sorte :

Code :
1
2
Search * FROM matable 
WHERE colonne LIKE '%<balise1>%<balise2>%blabla%</balise2>%<balise2b>%blablabla%</balise2b>%</balise1>%'
J'ai alors testé mon remplacer de la sorte

Code :
1
2
3
UPDATE matable 
SET colonne = REPLACE(colonne,'<balise1>%<balise2>%blabla%</balise2>%<balise2b>%blablabla%</balise2b>%</balise1>','test')
WHERE condition;
Et je crois que c'est gagné (Query returned successfully: 1 row affected) mais il ne m'a rien modifié... ce que je ne comprend pas trop.

En plus il reste ensuite la difficulté de la mise en forme du nouveau paragraphe.

Quelqu'un a-t-il une idée ?
fderuette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 12h23   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 955
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 955
Points : 17 779
Points : 17 779
PostGreSQL ne dispose pas de fonction de mise à jour des données XML contrairement à IBM DB2, Oracle ou SQL Server.
Pour la liste des fonctions disponible sous PostGreSQL pour gérer les documents XML, voir :
http://wiki.postgresql.org/wiki/XML_Support
http://developer.postgresql.org/pgdo...tions-xml.html

En conséquence, avec PG, vous devez récrire tout le document XML par un traitement externe et le réinjecter avec un UPDATE.

Par exemple sous MS SQL Server il suffit de faire :
Code :
1
2
UPDATE MaTable 
SET MaColonneXML = MaColonneXML.MODIFY('replace value of (/root/item/@value)[1] with sql:variable("@value")');
Pour aller remplacer la valeur du premier attribut value dans le path /root/item par le contenu de la variable @value.

Pour avoir un aperçu des possibilités de manipulation XML des SGBDR, lire le livre de Jim Melton (rapporteur de la norme SQL au comité de normalisation) :
http://www.amazon.fr/Querying-Xml-Xquery-Xpath-Context/dp/1558607110
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 22h03   #3
Invité de passage
 
Florian
Responsable SIG
Inscription : août 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Florian
Localisation : Etats-Unis

Informations professionnelles :
Activité : Responsable SIG
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : août 2011
Messages : 2
Points : 0
Points : 0
Merci pour la réponse.

Et si mon paragraphe n'est pas du xml, il n'y aurait pas de solution (tout SGBD confondus) ?

Concernant SQL Server, apparemment le native xml support est dans toutes les versions, je vais donc pouvoir tester avec SQLServer Express.

Voici un petit extrait des derniers niveaux de mon xml (le <gmd:MD_DigitalTransferOptions> est inclus dans 6 autres niveaux).

Citation:
<gmd:MD_DigitalTransferOptions>
<gmd:unitsOfDistribution>
<gco:CharacterString xmlns:gco="http://www.isotc211.org/2005/gco">Département</gco:CharacterString>
</gmd:unitsOfDistribution>
<gmd:transferSize>
<gco:Real xmlns:gco="http://www.isotc211.org/2005/gco">500.0</gco:Real>
</gmd:transferSize>
<gmd:onLine>
<gmd:CI_OnlineResource>
<gmd:linkage>
<gmd:URL>adresse web service</gmd:URL>
</gmd:linkage>
<gmd:protocol>
<gco:CharacterString xmlns:gco="http://www.isotc211.org/2005/gco">WWW:LINK-1.0-http--link</gco:CharacterString>
</gmd:protocol>
<gmd:name>
<gco:CharacterString xmlns:gco="http://www.isotc211.org/2005/gco">GeoService</gco:CharacterString>
</gmd:name>
</gmd:CI_OnlineResource>
</gmd:onLine>

</gmd:MD_DigitalTransferOptions>

Si je veux changer la valeur "adresse web service" je vais avoir quelque chose du genre :

Code :
1
2
UPDATE MaTable 
SET MaColonneXML = MaColonneXML.MODIFY('replace value of (/root/.../<gmd:MD_DigitalTransferOptions>/<gmd:onLine>/<gmd:CI_OnlineResource>/<gmd:linkage>/<gmd:URL>) with ("new adress")');
Mais si dans ce paragraphe, je veux ajouter 2 autres champs <gmd:online> (avec les balises imbriquées - tout ce qui est en rouge) je vais devoir déterminer auparavant la structure des balises imbriquées (l'exemple que j'ai donné est une simplification)...

Cela me semble assez complexe dans mon cas, je compte faire un script pour simplifier des modifications groupées sur des données après un harvesting. Je vais jeter un oeil du côté des ETL.
fderuette 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 14h19.


 
 
 
 
Partenaires

Hébergement Web