IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

DBeaver Oracle : Extraire la valeur d'une balise d'un xml


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut DBeaver Oracle : Extraire la valeur d'une balise d'un xml
    Forum,
    J'espère que tout le monde se porte bien.

    Dans ma table INBOX_MESSAGES, j'ai un colonne CONTENT qui contient un xml.
    Quand je veux extraire une valeur correspondant à une balise, j'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    	:mybalise AS Balise
    	,SUBSTR(im.CONTENT,INSTR(im.CONTENT, :mybalise) + LENGTH(:mybalise) + 1,
    	((INSTR(im.CONTENT, '/' || '' || :mybalise)-2)
    	- (INSTR(im.CONTENT, :mybalise) + LENGTH(:mybalise) + 1)+1)) AS BALISE_VALUE
     
    FROM INBOX_MESSAGES im 
    INNER JOIN PERSONS p2 ON p2.PERSON_ID =im.PERSON_ID 
    WHERE im.TYPE = 'D054'
    	AND im.OVERALL_START_DATE >= '01/07/2020' AND im.OVERALL_START_DATE <= '30/09/2020'
    ;
    Nom : Image 9.png
Affichages : 676
Taille : 487,3 Ko

    Oui, je sais, cela ressemble furieusement à de l'excel transformé pour la cause. C'est vrai mais cela fonctionne.
    Mais, je suis certain qu'il existe un moyen plus simple de trouver la balise et sa valeur. J'ai essayé avec XMLTABLE, XMLQUERY... rien n'y fait.
    Si vous avez une très bonne piste, je suis preneur.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    OMG, ce n'est pas du tout comme cela qu'il faut faire. Il faut en effet utiliser Xquery. Ici tu peux faire un XMLTABLE en précisant les namespaces de ton fichier xml. Ensuite tu précises le chemin où se trouve l'info.

  3. #3
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    Bonjour vanagreg,
    Je sais que tu as hésité

    Effectivement je ne m'en sors pas avec XMLTABLE.

    Ma façon de faire est tout ce qu'il ne faut pas faire mais elle est simple car j'encode uniquement le nom de la balise et il me retourne la valeur. Pas besoin d'inclure un chemin, surtout qu'il pourrait être différent ; ben oui, selon le flux, le xml contient certaines parties et pas d'autres.

    Mais si tu as un lien vers une explication facile pour être dans le sql pur, merci de me le fournir. Car avec ce que j'ai trouvé, je n'y arrive pas. Merci, merci...

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    J'avoue que ce n'est pas forcément évident à comprendre au début, et même mois je me considère comme débutant
    J'ai bien galéré au début quand il faut gérer des namespaces, et d'ailleurs j'ai toujours besoin de retrouver mes exemples passés pour me débrouiller.
    Je ne sais pas s'il existe des ressources qui expliquent comment utiliser XMLTABLE sur ce site, je suppose que oui, mais je ne sais pas où, d'autres seront mieux te renseigner.

    Le problème avec l'utilisation combinée de substr et instr, c'est que ça va vite ressembler à une usine à gaz si l'info se répète à plusieurs endroits, et que tu dois extraire toutes les valeurs. Sans parler de performances si ton document XML fait plusieurs centaines de Mo par exemple.

  5. #5
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    Bon, j'ai encore cherché mais rien n'y fait. Je n'arrive pas vraiment à trouver ce que je veux.
    C'est assez incroyable de ne pas arriver à lire la valeur d'un balise.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    Bonjour,

    Montre ce que tu as fait pour voir. Tu peux remplacer les valeurs sensibles par des "xxxxxx" si besoin.

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bonjour QuestVBA,

    Voici un exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     WITH x AS  (SELECT XMLTYPE('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <HF_DOCUMENT>
    	<INVENTAIRE>
    		<societe>1</societe>
    		<magasin>2</magasin>
    		<article>75987</article>
    		<ZONE>3</ZONE>
    		<emplacement>J0100</emplacement>
    		<date_inventaire>20201008</date_inventaire>
    		<qte_pal>1</qte_pal>
    		<qte>5</qte>
    		<COMMENTAIRE null="yes"></COMMENTAIRE>
    	</INVENTAIRE>
    	<INVENTAIRE>
    		<societe>1</societe>
    		<magasin>2</magasin>
    		<article>75986</article>
    		<ZONE>3</ZONE>
    		<emplacement>J0200</emplacement>
    		<date_inventaire>20201008</date_inventaire>
    		<qte_pal>1</qte_pal>
    		<qte null="yes"></qte>
    		<COMMENTAIRE>Tout vide</COMMENTAIRE>
    	</INVENTAIRE>
    </HF_DOCUMENT>') xml_data
    FROM dual)
    SELECT xt.*
    FROM x, XMLTABLE('/HF_DOCUMENT/INVENTAIRE'
             PASSING x.xml_data
             COLUMNS 
                    societe     			NUMBER  PATH 'societe',
                    magasin     	NUMBER  PATH 'magasin',
                    article     	NUMBER PATH 'article',
                    ZONE     			NUMBER PATH 'ZONE',
                    emplacement   VARCHAR2(10)  PATH 'emplacement',
                    date_inventaire     NUMBER PATH 'date_inventaire',
                    qte_pal  			NUMBER PATH 'qte_pal',
                    qte  					NUMBER PATH 'qte',
                    commentaire   VARCHAR2(2000)  PATH 'COMMENTAIRE'
                ) xt
    Retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SOCIETE	MAGASIN	ARTICLE	ZONE	EMPLACEMENT	DATE_INVENTAIRE	QTE_PAL	QTE	COMMENTAIRE
    1	2	75987	3	J0100	20201008	1	5	
    1	2	75986	3	J0200	20201008	1		Tout vide

Discussions similaires

  1. Oracle:Extraire valeur d'une balise XML
    Par Habib91 dans le forum XML/XSL et SOAP
    Réponses: 13
    Dernier message: 09/12/2019, 17h39
  2. [RSS] extraire des infos d'une balise: possible?
    Par csseur22 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 14/10/2006, 17h08
  3. test valeur d'une balise?
    Par -ADX- dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 22/05/2006, 11h38
  4. Récuperer la valeur d'une balise html
    Par spynux dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/02/2006, 09h40
  5. recupere valeur d'une balise select
    Par naourass dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 03/11/2005, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo