2016-10-27 8 views
0

Я пытаюсь выполнить запрос выбора следующим образом, где я передаю небольшой xml как xmltype.Запрос SELECT на xmltable

SELECT x.PO_STEP,x.INSTL_ID,X.INSTL_LOC_CODE from xmltable 
(
    XMLNAMESPACES('namespace1' as "v20", 'namespace2' as "v201"), 
'/v20:ProductionOrder/v201:ProductionOrderSteps/v201:ProductionOrderStep/v201:POStepDetails/v201:InstallationDetails/*[text()]' 
PASSING xmltype(' <v20:ProductionOrder xmlns="***something***" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v20="namespace1"> 

     <v201:ProductionOrderSteps xmlns:v201="namespace2"> 
      <v201:ProductionOrderStep> 
      <v201:POStepDetails> 
       <v201:PO_STEP>1L</v201:PO_STEP> 
       <v201:InstallationDetails> 
       <v201:INSTL_ID>032</v201:INSTL_ID> 
       <v201:INSTL_LOC_CODE>N</v201:INSTL_LOC_CODE> 
       </v201:InstallationDetails> 
       <v201:InstallationDetails> 
       <v201:INSTL_ID>000</v201:INSTL_ID> 
       <v201:INSTL_LOC_CODE /> 
       </v201:InstallationDetails> 
       <v201:InstallationDetails> 
       <v201:INSTL_ID>000</v201:INSTL_ID> 
       <v201:INSTL_LOC_CODE /> 
       </v201:InstallationDetails> 
       <v201:InstallationDetails> 
       <v201:INSTL_ID>000</v201:INSTL_ID> 
       <v201:INSTL_LOC_CODE /> 
       </v201:InstallationDetails> 
      </v201:POStepDetails> 
      </v201:ProductionOrderStep> 
      <v201:ProductionOrderStep> 
      <v201:POStepDetails> 
       <v201:PO_STEP>1B</v201:PO_STEP> 
       <v201:InstallationDetails> 
       <v201:INSTL_ID>001</v201:INSTL_ID> 
       <v201:INSTL_LOC_CODE>N</v201:INSTL_LOC_CODE> 
       </v201:InstallationDetails> 
       <v201:InstallationDetails> 
       <v201:INSTL_ID>000</v201:INSTL_ID> 
       <v201:INSTL_LOC_CODE /> 
       </v201:InstallationDetails> 
       <v201:InstallationDetails> 
       <v201:INSTL_ID>000</v201:INSTL_ID> 
       <v201:INSTL_LOC_CODE /> 
       </v201:InstallationDetails> 
      </v201:POStepDetails> 
      </v201:ProductionOrderStep> 
     </v201:ProductionOrderSteps> 
     </v20:ProductionOrder>') 

COLUMNS 
PO_STEP VARCHAR2(20) PATH './parent::*/parent::*/v201:PO_STEP', 
INSTL_ID VARCHAR2(30) PATH '//v201:INSTL_ID', 
INSTL_LOC_CODE VARCHAR2(30) PATH '//v201:INSTL_LOC_CODE' 
)x 

, но я получаю следующий результат

PO_STEP  INSTL_ID INSTL_LOC_CODE 
     1L  null  null 
     1L  null  null 
     1L  null  null 
     1L  null  null 
     1L  null  null 
     1B  null  null 
     1B  null  null 
     1B  null  null 
     1B  null  null 

Я не могу понять, что случилось с Xpath, выполняется ли принят XPath неправильно рядом колонн или XPath, написанные на вершине неправильно. Я использую разработчику Oracle SQL

ответ

0

Измените XPATH

/v20:ProductionOrder/v201:ProductionOrderSteps/v201:ProductionOrderStep/v201:POStepDetails/v201:InstallationDetails/*[text()]

в

/v20:ProductionOrder/v201:ProductionOrderSteps/v201:ProductionOrderStep/v201:POStepDetails/v201:InstallationDetails

Чтобы получить первое появление добавить [1] в конце концов, как:

/v20:ProductionOrder/v201:ProductionOrderSteps/v201:ProductionOrderStep/v201:POStepDetails/v201:InstallationDetails[1]

И

Изменение

./parent::*/parent::*/v201:PO_STEP

в

./parent::*/v201:PO_STEP

Результат будет:

1L 032 N 
1L 000 
1L 000 
1L 000 
1B 001 N 
1B 000 
1B 000 

Только в первом случае результатом будет:

1L 032 N 
1B 001 N 
+0

Большое спасибо. А что, если мне нужно только увидеть первое вхождение каждого , т.е. выход должен выглядеть следующим образом 1L 032 N 1B 001 N – ArpanMona

+0

Я редактировал ответ о том, как получить только первое появление. – SomeDude

+0

Спасибо тонну ... – ArpanMona