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

PL/SQL Oracle Discussion :

Extraire XML via procedure


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Par défaut Extraire XML via procedure
    Bonjour
    J’ai besoin de pouvoir extraire les informations d’un XML (pour l’instant j’utilise un DBMS)
    Dans l’exemple suivant je tente de faire um DBMS des valeurs de mon XML, le problème est que comme j’ai plusieur foi la tag <TICKET_NO> Oracle me retourne une erreur(ORA-19025: EXTRACTVALUE returns value of only one node).

    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
    42
     
    DECLARE
       --
       retval xmltype := xmltype('<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
      <env:Header/>
      <env:Body>
      <TICKETCreateRespMsg xmlns="http://www.testurl.com/webservices/">
      <body xmlns="">
      <CreateTicket>
      <TICKET_NO>A-32758628</TICKET_NO>
      <TICKET_NO>C-32758628</TICKET_NO>
      <TICKET_NO>B-32758628</TICKET_NO>  
      <SUMMARY>Test1</SUMMARY>
      <ERROR_MSG>Test2</ERROR_MSG>
      </CreateTicket>
      </body>
      </TICKETCreateRespMsg>
      </env:Body>
      </env:Envelope>');
     
        v_ticket_no VARCHAR2(30);
        v_summary   VARCHAR2(30);
        v_error_msg VARCHAR2(30);
     
        v_ns_map    VARCHAR2(200) := 'xmlns:env="http://schemas.xmlsoap.org/soap/envelope/", xmlns:ns1="http://www.testurl.com/webservices/"';
        v_xpath     VARCHAR2(200) := '/env:Envelope/env:Body/ns1:TICKETCreateRespMsg/body/CreateTicket';
      --  
      BEGIN
      --
       FOR I IN (SELECT extractValue(retval, v_xpath || '/TICKET_NO', v_ns_map) TICKET_NO,
                        extractValue(retval, v_xpath || '/SUMMARY', v_ns_map) SUMMARY ,
                        extractValue(retval, v_xpath || '/ERROR_MSG', v_ns_map)ERROR_MSG
                 --INTO v_ticket_no, v_summary, v_error_msg
                   FROM dual) LOOP
       --           
       dbms_output.put_line('TICKET_NO = '||i.TICKET_NO);
       dbms_output.put_line('SUMMARY = '|| i.summary);
       dbms_output.put_line('ERROR_MSG = '|| i.error_msg);
      --  
      END LOOP;
    --  
    END;
    Avez-vous une idée de comment faire pour extraire toutes les valeurs de mon XML?

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Utilisez XmlTable. Cherchez sur ce forum, j'ai posté à plusieurs reprises des exemples.

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Probablement quelque chose comme l'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
    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
    67
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
     
    SQL> set serveroutput on
    SQL> 
    SQL> DECLARE
      2     --
      3    retval xmltype := xmltype('<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
      4    <env:Header/>
      5    <env:Body>
      6    <TICKETCreateRespMsg xmlns="http://www.testurl.com/webservices/">
      7    <body xmlns="">
      8    <CreateTicket>
      9    <TICKET_NO>A-32758628</TICKET_NO>
     10    <TICKET_NO>C-32758628</TICKET_NO>
     11    <TICKET_NO>B-32758628</TICKET_NO>
     12    <SUMMARY>Test1</SUMMARY>
     13    <ERROR_MSG>Test2</ERROR_MSG>
     14    </CreateTicket>
     15    </body>
     16    </TICKETCreateRespMsg>
     17    </env:Body>
     18    </env:Envelope>');
     19    --
     20    BEGIN
     21    --
     22     FOR I IN (
     23     Select b.Ticket as TICKET_NO,
     24              a.Summary,
     25              a.error_msg
     26         From XmlTable(Xmlnamespaces('http://www.testurl.com/webservices/' as "ns1", 'http://schemas.xmlsoap.org/soap/envelope/' As "env"),
     27                       'for $i in /env:Envelope/env:Body/ns1:TICKETCreateRespMsg/body/CreateTicket
     28                        return $i
     29                  '
     30                  passing retval
     31                  Columns Summary     Varchar2(30)  Path 'SUMMARY',
     32                          error_msg   Varchar2(30)  Path 'ERROR_MSG',
     33                          Tickets     XmlType       Path 'TICKET_NO'
     34                 ) a,
     35              XmlTable ('for $i in TICKET_NO
     36                         return $i
     37                        '
     38                  passing a.Tickets
     39                  Columns Ticket     Varchar2(30)  Path '/TICKET_NO'
     40                       ) b
     41     ) LOOP
     42     --
     43     dbms_output.put_line('TICKET_NO = '||i.TICKET_NO);
     44     dbms_output.put_line('SUMMARY = '|| i.summary);
     45     dbms_output.put_line('ERROR_MSG = '|| i.error_msg);
     46    --
     47    END LOOP;
     48  --
     49  END;
     50  /
    TICKET_NO = A-32758628
    SUMMARY = Test1
    ERROR_MSG = Test2
    TICKET_NO = C-32758628
    SUMMARY = Test1
    ERROR_MSG = Test2
    TICKET_NO = B-32758628
    SUMMARY = Test1
    ERROR_MSG = Test2
    PL/SQL procedure successfully completed
     
    SQL>

Discussions similaires

  1. [PHP 4] Extraire des données d'un fichier xml via xsl et xpath
    Par fraisa1985 dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2010, 10h23
  2. transformation xml via xslt
    Par ronnie dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 10/05/2005, 10h58
  3. Accès à un fichier xml via hibernate
    Par boisdin dans le forum Hibernate
    Réponses: 12
    Dernier message: 20/01/2005, 14h54
  4. Generer du xml via SQL(oracle) avec de l'asp
    Par jpg dans le forum XQUERY/SGBD
    Réponses: 6
    Dernier message: 03/08/2004, 12h36
  5. recherche dans un document xml via DOM
    Par ndoye_zaff dans le forum APIs
    Réponses: 5
    Dernier message: 11/06/2003, 14h44

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