如何从 Oracle 10g 中的 XML 类型列中 select 值

How to select values from XML type column in oracle 10g

下面是我的 xml 列,名称为 xml_col。我想要 select ProductType 是 productname 且 ProductCode 是 1111 的所有计划名称。

<life>
 <Holding id="Holding">
<HoldingTypeCode tc="2">Policy</HoldingTypeCode>
<Purpose tc="11">example</Purpose>
<Policy>
  <ProductType tc="235684546454">productname</ProductType>
  <ProductCode>1111</ProductCode>
  <PlanName>name_plan</PlanName>
   </Policy>
 </Holding>
</life>

我尝试了以下简单到 select,它对我不起作用。请帮忙

select extractValue(xml_col,'/LifE/Policy/PlanName') "plan" 
FROM mytable

为了查询 mt 场景,我查询如下显示错误 "ORA-00904: "schemaname"."tablename "."xml_col": invalid identifier" pls help

 select extractValue(xml_col,'/lifE/Holding/Policy/PlanName') "plan name" FROM schemaname.tablename WHERE schemaname.tablename.xml_col.exist('/lifE/Holding/Policy/ProductCode[text()  = "1111"]') = 1  

@mikron 是正确的。 XML 区分大小写。

select extractValue(xml_col,'/life/Holding/Policy/PlanName') "plan" 
FROM mytable

编辑:如@mikron

所指出的那样更新

如果我是你,我不会使用 extract 或 extractvalue,因为自 Oracle 10g 以来它们都被弃用了。相反,使用 XMLTABLE,类似于:

with sample_data as (select xmltype(
'<life>
  <Holding id="Holding">
    <HoldingTypeCode tc="2">Policy</HoldingTypeCode>
    <Purpose tc="11">example</Purpose>
    <Policy>
      <ProductType tc="235684546454">productname</ProductType>
      <ProductCode>1111</ProductCode>
      <PlanName>name_plan</PlanName>
    </Policy>
  </Holding>
  <Holding id="Holding">
    <HoldingTypeCode tc="2">Policy</HoldingTypeCode>
    <Purpose tc="11">example</Purpose>
    <Policy>
      <ProductType tc="235684546454">productname</ProductType>
      <ProductCode>1112</ProductCode>
      <PlanName>name_plan</PlanName>
    </Policy>
  </Holding>
</life>') xml_data from dual)
select xml_data,
       x.*
from   sample_data sd
       cross join xmltable('/life/Holding'
                           passing sd.xml_data
                           columns product_type varchar2(20) path 'Policy/ProductType',
                                   product_code number path 'Policy/ProductCode',
                                   plan_name varchar2(20) path 'Policy/PlanName') x
where  x.product_type = 'productname'
and    x.product_code = 1111;

XML_DATA   PRODUCT_TYPE PRODUCT_CODE PLAN_NAME 
---------- ------------ ------------ ---------
<life>...  productname          1111 name_plan