выберите различные значения в XMLType - PullRequest
3 голосов
/ 07 ноября 2010

У меня есть таблица с полем XMLType.Таблица создается и загружается с использованием следующего DDL / DML:

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>'));        

Я хочу получить различные значения в / attribute / attribute / name в строках;Итак, с данными O хотелось бы получить:

remoteAddress
domain
user

До сих пор я пробовал следующий запрос:

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

Но я получаю следующее сообщение:

ORA-19025: EXTRACTVALUE возвращает значение только одного узла

Если я использую

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

Я получил XML-результат, который содержит:

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

Но я хотел бычтобы получить их в виде строк, как я могу это сделать?

TIA

Ответы [ 2 ]

2 голосов
/ 08 ноября 2010

Что-то вроде:

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

Если вы поставите CREATE TABLE и INSERT, тогда будет проще дать точный SQL

0 голосов
/ 08 ноября 2010

Я понял.Основываясь на том, что сказал Гэри:

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

Спасибо!

...