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 :

EXTRACTVALUE Erreur ORA-00932


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 704
    Points : 934
    Points
    934
    Par défaut EXTRACTVALUE Erreur ORA-00932
    Bonjour

    J'ai besoin de rechercher dans le contenu XML d'un CLOB une valeur particuliere

    Table AVANT avec un BLOB nomme CONTENT de type CLOB

    Oracle 11 standard
    le contenu du CLOB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <TypeBMessage xmlns="http://XXXSchemas/TypeBMessage.xsd" xmlns:ns2="http://XXX/zzz-v1/Avant/xsd">
    <Header>
    <AvantType>ABC</AvantType>
    </Header>
    <Body>
    .......
    </Body>
    </TypeBMessage>
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select extractvalue(CONTENT, '/Header/AvantType') AS type
    from AVANT
    --where id=996630; 
    where extractvalue(CONTENT, '/Header/AvantType') = 'ABC';

    ORA-00932: inconsistent datatypes: expected – got -
    00932. 00000 - "inconsistent datatypes: expected %s got %s"
    *Cause:
    *Action:

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 934
    Points : 4 347
    Points
    4 347
    Par défaut
    Le premier paramètre de EXTRACTVALUE doit être un XMLTYPE pas un CLOB.

    La balise "<AvantType>ABC</EventType>" n'est pas correcte.

    Le path
    '/Header/AvantType' n'est pas correct : il manque le niveau TypeBMessage et il va falloir tenir compte du xmlns dedans.

    AvantType n'est pas préfixé par son namespace dans le XML, cela pourrait poser problème.

    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT extractvalue( XMLTYPE(    q'{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <TypeBMessage xmlns="http://XXXSchemas/TypeBMessage.xsd" xmlns:ns2="http://XXX/zzz-v1/Avant/xsd">
        <Header>
        <ns2:AvantType>ABC</ns2:AvantType>
        </Header>
        </TypeBMessage>}') , '/ns1:TypeBMessage/ns1:Header/ns2:AvantType' , 'xmlns:ns1="http://XXXSchemas/TypeBMessage.xsd" xmlns:ns2="http://XXX/zzz-v1/Avant/xsd"') as val 
        from dual ;


  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 135
    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 135
    Points : 1 913
    Points
    1 913
    Par défaut
    Bonjour,

    Quelle est ta version d'Oracle?
    Il faut savoir que la fonction EXTRACTVALUE est dépréciée depuis la 11g (depuis 15 ans donc).

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 704
    Points : 934
    Points
    934
    Par défaut
    bonjour

    C'est un Oracle 11.2.0.4 entreprise. Le contenu du CLOB est lisible dans SQLDEV
    Le vrai nom du champ était bien sur EventType, mais j'ai changé quelques éléments pour des questions de confidentialité
    Le pb persiste même avec
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select extractvalue(CONTENT, 'TypeBMessage/Header/AvantType') AS type
    from AVANT
    where id=996630;
    select extractvalue(CONTENT, '/TypeBMessage/Header/AvantType') AS type
    from AVANT
    where id=996630;

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 934
    Points : 4 347
    Points
    4 347
    Par défaut
    https://docs.oracle.com/en/database/...RACTVALUE.html

    Le premier paramètre doit être un XMLTYPE pas un CLOB, donc :

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 704
    Points : 934
    Points
    934
    Par défaut
    J'ai essaye ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select extractvalue(xmltype(CONTENT), '/TypeBMessage/Header/AvantType') AS cd
    from AVANT
    where id=996630;

    => pas derreur mais la valeur null sous sqldev

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 934
    Points : 4 347
    Points
    4 347
    Par défaut
    Cà c'est dû à la gestion des namespaces : regardez l'exemple qui fonctionne que j'ai posté plus haut.

    Ou celle-ci aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT extractvalue( XMLTYPE(
        q'{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <TypeBMessage xmlns="http://XXXSchemas/TypeBMessage.xsd" xmlns:ns2="http://XXX/zzz-v1/Avant/xsd">
        <Header>
        <AvantType>ABC</AvantType>
        </Header>
        </TypeBMessage>}') , '/TypeBMessage/Header/AvantType' , 'xmlns="http://XXXSchemas/TypeBMessage.xsd"') as val 
        from dual ;

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 704
    Points : 934
    Points
    934
    Par défaut
    Ok par contre dans la vrai vie j'ai 3 xsd et je sais pas qui definit quoi !
    Quand je les positionne dans le navigateur je n'ai pas les XSD

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 934
    Points : 4 347
    Points
    4 347
    Par défaut
    Alors utilisez cette XSLT:

    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
    select xmltransform ( XMLTYPE(q'{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <TypeBMessage xmlns="http://XXXSchemas/TypeBMessage.xsd" xmlns:ns2="http://XXX/zzz-v1/Avant/xsd">
        <Header>
        <AvantType>ABC</AvantType>
        </Header>
        </TypeBMessage>}'), XMLTYPE ( '<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:template match="node()">
      <xsl:copy>
       <xsl:apply-templates select="node() | @*" />
      </xsl:copy>
     </xsl:template>
     <xsl:template match="*">
      <xsl:element name="{local-name()}">
       <xsl:apply-templates select="node() | @*" />
      </xsl:element>
     </xsl:template>
     <xsl:template match="@*">
      <xsl:copy>
       <xsl:apply-templates select="node() | @*" />
      </xsl:copy>
     </xsl:template>
    </xsl:stylesheet>' )
    ).getClobVal()
    from DUAL ;

    Ou encore utiliser local-name():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        SELECT extractvalue( XMLTYPE(
        q'{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <TypeBMessage xmlns="http://XXXSchemas/TypeBMessage.xsd" xmlns:ns2="http://XXX/zzz-v1/Avant/xsd">
        <Header>
        <ns2:AvantType>ABC</ns2:AvantType>
        </Header>
        </TypeBMessage>}') , q'~/*/*/*[local-name() = 'AvantType']~' 
    ) as val 
        from dual ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <TypeBMessage>
     <Header>
      <AvantType>ABC</AvantType>
     </Header>
    </TypeBMessage>

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 704
    Points : 934
    Points
    934
    Par défaut
    Merci beaucoup a vous tous pour votre temps passé avec moi.
    J'ai pus finalement parser les XML contenu dans les CLOB avec les xmltype et les liens au xsd ont fonctionné

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur ORA 00932
    Par LlufRuS dans le forum SQL
    Réponses: 0
    Dernier message: 04/03/2008, 18h18
  2. Réponses: 4
    Dernier message: 19/09/2007, 17h18
  3. Erreur ORA-00932 types de données incohérents
    Par paradeofphp dans le forum Oracle
    Réponses: 7
    Dernier message: 21/05/2007, 11h56
  4. erreur ora-12801 : error signaled in parallel query server
    Par dngaya dans le forum Administration
    Réponses: 5
    Dernier message: 15/04/2004, 17h25
  5. erreur "ORA-22905" lors de l'execution d'un requet
    Par benji999 dans le forum Administration
    Réponses: 26
    Dernier message: 14/04/2004, 12h47

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