2016-07-04 2 views
0

Это мои данные CLOBXML Извлечение тегов значение из столбца CLOB с несколькими тегами с таким же именем в Oracle

<id>ID001</id> 
<atrbtList> 
    <Atrbts> 
     <atrTyp>1</atrTyp> 
     <atrVal>04120101254</atrVal> 
    </Atrbts> 
    <Atrbts> 
     <atrTyp>2</atrTyp> 
     <atrVal>1254</atrVal> 
    </Atrbts> 
</atrbtList> 

в таблице.

Мне нужно извлечь данные в виде

ID |Type |Value 
------------------ 
ID001 | 1 |04120101254 
ID001 | 2 |1254 

В настоящее время я использую функцию экстракта Oracle XML и это, насколько я пошел с запросом

SELECT 
     XMLTYPE(xml_clob).extract('//id/text()').getStringVal() AS Id, 
     EXTRACTVALUE(s1.COLUMN_VALUE, '//atrTyp') AS AtrTyp, 
     EXTRACTVALUE(s.COLUMN_VALUE, '//atrVal') AS AtrVal 
    FROM table_name T, 
      TABLE(
      XMLSequence(
       EXTRACT(
       XMLType(T.xml_clob), 
       '//atrVal' 
       ) 
      ) 
      ) s, 
      TABLE(
      XMLSequence(
       EXTRACT(
       XMLType(T.xml_clob), 
       '//atrTyp' 
       ) 
      ) 
      ) s1 

и это дает результат

ID |Type |Value 
------------------ 
ID001 1 04120101254 
ID001 2 04120101254 
ID001 1 1254 
ID001 2 1254 

Может ли кто-нибудь указать мне в правильном направлении, чтобы получить желаемый результат t, и я также чувствую, что запрос может быть улучшен или есть лучший способ сделать это, которого я не вижу.

PS: Стол и его содержимое

CREATE TABLE table_name (xml_clob CLOB); 

INSERT INTO table_name VALUES ( 
'<data><id>ID001</id><atrbtList><Atrbts><atrTyp>1</atrTyp><atrVal>04120101254</atrVal></Atrbts><Atrbts><atrTyp>2</atrTyp><atrVal>1254</atrVal></Atrbts></atrbtList></data>' 
); 

ответ

0

Вы делаете перекрестное соединение 2х2 = 4. Вы должны получить atrbtList в виде таблицы (последовательность Atrbts):

SELECT XMLTYPE(xml_clob).extract('//id/text()').getStringVal() AS Id, 
     EXTRACTVALUE(s.COLUMN_VALUE, '/Atrbts/atrTyp') AS AtrTyp, 
     EXTRACTVALUE(s.COLUMN_VALUE, '/Atrbts/atrVal') AS AtrVal 
    FROM table_name T, 
      TABLE(
      XMLSequence(
       EXTRACT(
       XMLType(T.xml_clob), 
       '/data/atrbtList/*' 
       ) 
      ) 
      ) s 
Смежные вопросы