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 :

Index basé sur XMLTABLE sur des nœuds multiples


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Index basé sur XMLTABLE sur des nœuds multiples
    Bonjour,

    je travaille actuellement sur une base qui stocke des XML dans des champs CLOB
    Le premier souci que je rencontre est que ces XML ne sont pas forcément corrects.

    Ils ne sont même jamais corrects, car il manque une balise de fermeture : </java>
    Le champ utilisé est le champ DAT_FICHIERSMODIF, du coup j'utilise cette syntaxe pour contourner ce 1er problème :
    XMLTYPE(DAT_FICHIERSMODIF || '</java>')
    Ainsi je peux parcourir les nœuds du XML sans souci.

    Mon souci ce situe sur les nœuds multiple
    j'ai réussit à créer un INDEX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE INDEX idx_df_rae_entree ON DATA_FICHIERS
    PARAMETERS('XMLTABLE XMLTYPE(DAT_FICHIERSMODIF || ''</java>'') ''/java/object/void[@property="historiques"]/object/void/object/void/object/void[@property="rae"]''
                  columns 
                  cncDateDebut NUMBER   PATH ''object/void[@property="cncDateDebut"]/object/long'' '
                 )
    l'index se crée bien, maintenant je ne sais pas comment interroger mes données pour que l'index soit utilisé

    une idée ?

    Merci

    Greg

  2. #2
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    ATTENTION : je ne parle pas des balises /*+ +*/ qui n'ont pas d'impact dans mon cas
    J'ai vu en parcourant le net que la syntaxe du SELECT doit être identique à celle de l'INDEX pour qu'il fonctionne

    exemple :
    j'ai cet index basé sur un noeud simple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     CREATE INDEX idx_df_idoffre ON DATA_FICHIERS
       (CASE WHEN DAT_FICHIERSMODIF IS NOT NULL THEN EXTRACTVALUE(XMLTYPE(DAT_FICHIERSMODIF || '</java>'),  '(/java/object/void[@property="historiques"]/object/void/object/void/object/void[@property="offre"]/object/void[@property="offOffreid"]/string)') ELSE NULL END);


    si je fais mon SELECT ainsi :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DAT_ID_INSERTION 
    FROM DATA_FICHIERS
    WHERE EXTRACTVALUE(XMLTYPE(DAT_FICHIERSMODIF || '</java>'), '(/java/object/void[@property="historiques"]/object/void/object/void/object/void[@property="offre"]/object/void[@property="offOffreid"]/string)') = '10'
    AND DAT_FICHIERSMODIF IS NOT NULL
    AND DAT_ID_ETAT IN (20,25,70,75);
    l'index n'est pas utilisé


    alors que si je le fais ainsi :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DAT_ID_INSERTION 
    FROM DATA_FICHIERS
    WHERE (CASE WHEN DAT_FICHIERSMODIF IS NOT NULL 
                THEN EXTRACTVALUE(XMLTYPE(DAT_FICHIERSMODIF || '</java>'), '(/java/object/void[@property="historiques"]/object/void/object/void/object/void[@property="offre"]/object/void[@property="offOffreid"]/string)') 
                ELSE NULL END) = '10'
    AND DAT_FICHIERSMODIF IS NOT NULL
    AND DAT_ID_ETAT IN (20,25,70,75);
    il est utilisé



    je n'arrive pas à faire un SELECT utilisant mon index sur nœud multiple de la même façon
    exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  count(1)
    FROM DATA_FICHIERS, XMLTABLE( '/java/object/void[@property="historiques"]/object/void/object/void/object/void[@property="rae"]' 
                                  PASSING XMLTYPE(DAT_FICHIERSMODIF || '</java>') 
                                  columns 
                                  cncDateDebut NUMBER   PATH 'object/void[@property="cncDateDebut"]/object/long')
    WHERE cncDateDebut = 1430431200000
    AND DAT_FICHIERSMODIF IS NOT NULL
    AND DAT_ID_ETAT IN (20,25,70,75);

    je ne vois pas comment faire un SELECT qui permettrait d'utiliser l'INDEX...

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Je pense que mon index n'est pas bon, la création se fait en 1s grand max, là où mon autre exemple sur un noeud simple prend 2h

    ma question devrait donc plutôt être :
    Comment créer un index sur un nœud multiple ?
    ou plus précisément :
    Comment créer un index sur un nœud multiple d'un champ calculé sur un XML stocké en CLOB ?

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bon je pencherai sur le fait que je ne précise pas "INDEXTYPE IS XDB.XMLIndex"

    ce type n'est pas déclaré dans ma base Oracle, je vois avec les experts pour le faire rajouter

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Mon type d'index est créé mais ma joie est de courte durée :
    mon champ n'étant un pur xml ça râle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE INDEX idx_df_rae_entree 
    ON DATA_FICHIERS(DAT_FICHIERSMODIF) 
    INDEXTYPE IS XDB.XMLIndex
      PARAMETERS ('XMLTable po_ptab                                                    
                     ''/java/object/void[@property="historiques"]/object/void/object/void/object/void[@property="rae"]'' 
                     PASSING XMLTYPE(DAT_FICHIERSMODIF || ''</java>'') 
                     COLUMNS cncDateDebut NUMBER   PATH ''object/void[@property="cncDateDebut"]/object/long'' 
                   ');
    ORA-29958: une erreur fatale s'est produite lors de l'exécution de la routine ODCIINDEXCREATE
    ORA-30963: La colonne indexée n'est pas de type XML.

    comment lui indiquer de se baser sur ça :
    XMLTYPE(DAT_FICHIERSMODIF || ''</java>'')
    et non sur mon champ DAT_FICHIERSMODIF qui est un XML castré
    ???

    sachant qu'en déclarant le champ calculé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE INDEX idx_df_rae_entree 
    ON DATA_FICHIERS(XMLTYPE(DAT_FICHIERSMODIF || ''</java>'') ) 
    INDEXTYPE IS XDB.XMLIndex
      PARAMETERS ('XMLTable po_ptab                                                    
                     ''/java/object/void[@property="historiques"]/object/void/object/void/object/void[@property="rae"]'' 
                     PASSING XMLTYPE(DAT_FICHIERSMODIF || ''</java>'') 
                     COLUMNS cncDateDebut NUMBER   PATH ''object/void[@property="cncDateDebut"]/object/long'' 
                   ');
    ça passe pas !

Discussions similaires

  1. Numérotation de bas de page sur la table des matières
    Par carkiasis dans le forum Mise en forme
    Réponses: 3
    Dernier message: 26/08/2008, 17h55
  2. Utiliser des connexions multiples sur des listes
    Par MasterJul dans le forum SharePoint
    Réponses: 0
    Dernier message: 08/02/2008, 12h41
  3. Réponses: 9
    Dernier message: 13/08/2007, 16h41
  4. Réponses: 3
    Dernier message: 09/05/2007, 11h43
  5. Compteur sur l'utilisation des index
    Par hkhan dans le forum Administration
    Réponses: 11
    Dernier message: 14/10/2004, 17h57

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