2010-11-07 6 views
3

J'ai une table qui a un champ XMLType. La table est créée et chargée à l'aide de la DDL suivante/DML:Sélectionnez des valeurs distinctes sur XMLType

CREATE TABLE T_ECO_test_LOG 
(
    SECID    NUMBER      NOT NULL, 
    LOG_ATTRIBUTES SYS.XMLTYPE 
) 

INSERT INTO t_eco_test_log VALUES 
    (  1, XMLType(
       '<attributes> 
    <attribute> 
    <name>remoteAddress</name> 
    <value>180.201.106.130</value> 
    </attribute> 
    <attribute> 
    <name>domain</name> 
    <value>BSI_US</value> 
    </attribute> 
</attributes>')); 

INSERT INTO t_eco_test_log VALUES 
    (  2, XMLType(
       '<attributes> 
    <attribute> 
    <name>user</name> 
    <value>xxxx</value> 
    </attribute> 
    <attribute> 
    <name>domain</name> 
    <value>BSI_US</value> 
    </attribute> 
</attributes>'));   

Je veux obtenir les différentes valeurs/attributs/attribut/nom, en lignes; Donc, avec des données O voudraient obtenir:

remoteAddress 
domain 
user 

Jusqu'à présent, je l'ai essayé la requête suivante:

select extractValue(value(x),'/attributes/attribute/name') 
    from t_eco_log, 
     table(xmlsequence(extract(log_attributes,'/attributes')))x 

Mais je reçois le message suivant:

ORA-19025: retourne ExtractValue la valeur d'un seul nœud

Si je

select extract(value(x),'/attributes/attribute/name') 
    from t_eco_log, 
     table(xmlsequence(extract(log_attributes,'/attributes')))x 

J'ai obtenu un résultat XML qui contient:

<name>remoteAddress</name><name>domain</name> 

Mais je voudrais les obtenir sous forme de lignes, comment puis-je faire?

TIA

Répondre

2

Quelque chose comme:

with x1 as (select xmltype('<attributes> 
    <attribute> 
    <name>remoteAddress</name> 
    <value>180.201.106.130</value> 
    </attribute> 
    <attribute> 
    <name>domain</name> 
    <value>BSI_US</value> 
    </attribute> 
</attributes>') x2 from dual) 
select extract(value(x3),'/attribute/name') 
    from x1, 
     table(xmlsequence(extract(x2,'/attributes/*'))) x3 

Si vous fournissez CREATE TABLE et INSERT, alors il est plus facile de donner un SQL

+0

J'ai édité la question pour la clarifier, en donnant un exemple de la table et des données, et ce que je veux obtenir. Merci de votre aide! –

0

précise que je l'ai eu. Baser sur ce que Gary a mis:

with x1 as (select log_attributes x2 from t_eco_test_log) 
select distinct(extractValue(value(x3),'/attribute/name')) 
    from x1, 
     table(xmlsequence(extract(x2,'/attributes/*'))) x3 

Merci!

Questions connexes