2016-11-29 6 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'경우입니다 단지 = 'ATTR2'
  • 이름을 경우에만 ATTR_VAL 필드 GET 값 = 'ATTR1'와
    이름을 경우 ATTR_NAME 필드
    는 가치를 다음 노드 이름 = 'StepType1'의 많은 바보 경우 르 ATTR_NAME = @type, ATTR_VAL = @ 이름과 ATTR_ID = ID
  • 나는 그것이 가능하다하더라도 잘 모릅니다

하지만 좋은 것입니다 시작하는 어떤 생각 @?

답변

1

당신은 십자가과 같이, 모든 노동 조합과 주요 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