在xmltable上的SELECT查询

时间:2016-10-27 14:25:54

标签: sql oracle xpath xquery xmltable

我正在尝试按如下方式执行选择查询,其中我将一个小的xml作为xmltype传递。

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 developer

1 个答案:

答案 0 :(得分: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