2016-11-29 7 views
0

Я пытаюсь запросить XMLType для условного возврата.
Мой XML-запрос:oracle XMLTABLE условный возврат

with tab as (
select XMLType(
'<Obj name="Job" id="1"> 
    <Steps> 
     <StepType2> 
      <StepOptions> 
       <Attribute name="attr1" value="val1"/> 
       <Attribute name="attr2" value="val2"/> 
       <Attribute name="attr3" value="val3"/> 
      </StepOptions> 
     </StepType2> 
     <StepType1 type="flow" name="flowval" id="103"/> 
     <StepType1 type="data" name="dataval" id="104"/> 
     <StepType2> 
      <StepOptions> 
       <Attribute name="attr1" value="val5"/> 
       <Attribute name="attr2" value="val6"/> 
      </StepOptions> 
     </StepType2> 
    </Steps> 
</Obj>') as xmldata 
    from dual 
) 
select x.* 
    from tab, 
     XMLTable('for $i in $XmlData//* 
        return $i' 
        PASSING xmldata as "XmlData" 
        COLUMNS node VARCHAR2(2000) PATH 'name()', 
          name VARCHAR2(2000) PATH '@name', 
          id VARCHAR2(2000) PATH '@id' 
       ) x 

я слишком много поиск по XML DB оракула, XPATH и так далее, но я не мог найти ни малейшего представления, как достичь своей цели.

основном то, что я хочу этого добиться результатов:
enter image description here

  • Показать все элементы Ступеньки с их корневой родителем, в этом случае корня «Obj»
  • , если имя узла = «StepType2», то
    для поля attr_name получить значение, если только имя = «attr1» и
    для значения ПОЛУЧИТЬ ATTR_VAL поля, если только имя = «» attr2
  • если имя узла = «StepType1», то его гораздо простофиля ле attr_name = @type, ATTR_VAL = @ имя и ATTR_ID = @ ID

Я не знаю даже, если это возможно, но любая идея, чтобы начать было бы здорово?

ответ

1

Вы можете сделать это кросс присоединиться к steptype XMLs к основным XMLs с профсоюзом все, вот так:

with tab as (
select XMLType(
'<Obj name="Job" id="1"> 
    <Steps> 
     <StepType2> 
      <StepOptions> 
       <Attribute name="attr1" value="val1"/> 
       <Attribute name="attr2" value="val2"/> 
       <Attribute name="attr3" value="val3"/> 
      </StepOptions> 
     </StepType2> 
     <StepType1 type="flow" name="flowval" id="103"/> 
     <StepType1 type="data" name="dataval" id="104"/> 
     <StepType2> 
      <StepOptions> 
       <Attribute name="attr1" value="val5"/> 
       <Attribute name="attr2" value="val6"/> 
      </StepOptions> 
     </StepType2> 
    </Steps> 
</Obj>') as xmldata 
    from dual 
), 
    main_xml AS (SELECT mx.root_type, 
         mx.root_name, 
         mx.steptype1, 
         mx.steptype2 
       FROM tab 
         CROSS JOIN XMLTABLE('/*' PASSING tab.xmldata 
              COLUMNS root_type VARCHAR2(50) PATH 'name(.)', 
                root_name VARCHAR2(50) PATH '@name', 
                steptype1 XMLTYPE PATH '//StepType1', 
                steptype2 XMLTYPE PATH '//StepType2') mx) 
SELECT mx.root_type, 
     mx.root_name, 
     st1.attr_name, 
     st1.attr_val, 
     st1.attr_id 
FROM main_xml mx 
     CROSS JOIN XMLTABLE('/StepType1' PASSING mx.steptype1 
          COLUMNS attr_name VARCHAR2(50) PATH '@type', 
            attr_val VARCHAR2(30) PATH '@name', 
            attr_id INTEGER PATH '@id') st1 
UNION ALL 
SELECT mx.root_type, 
     mx.root_name, 
     st2.attr_name, 
     st2.attr_val, 
     NULL attr_id 
FROM main_xml mx 
     CROSS JOIN XMLTABLE('/StepType2' PASSING mx.steptype2 
          COLUMNS attr_name VARCHAR2(30) PATH '//Attribute[@name="attr1"]/@value', 
            attr_val VARCHAR2(30) PATH '//Attribute[@name="attr2"]/@value', 
            attr_id INTEGER PATH '@id') st2; 

Какие результаты в:

ROOT_TYPE ROOT_NAME ATTR_NAME ATTR_VAL ATTR_ID 
--------- --------- --------- -------- ---------- 
Obj  Job  flow  flowval   103 
Obj  Job  data  dataval   104 
Obj  Job  val1  val2  
Obj  Job  val5  val6  
+0

большое спасибо .. – Deniz

 Смежные вопросы

  • Нет связанных вопросов^_^