如何从 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
下面是我的 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