【问题标题】:How to select values from XML type column in oracle 10g如何从 oracle 10g 中的 XML 类型列中选择值
【发布时间】:2015-09-29 07:18:33
【问题描述】:

下面是我的名为 xml_col 的 xml 列。我想选择 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 extractValue(xml_col,'/LifE/Policy/PlanName') "plan" 
FROM mytable

要查询 mt 方案,我查询如下,显示错误“ORA-00904:“schemaname”。“tablename”。“xml_col”:无效标识符”请帮助

 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  

【问题讨论】:

  • 为什么是 MySQL/Mysqlii 标签?这些产品是如何涉及的,还是不是 Oracle?
  • 你的path有误,试试/life/Holding/Policy/PlanName

标签: sql xml oracle oracle10g


【解决方案1】:

如果我是你,我不会使用 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_data,sample_data.. 我只处理 1 个表。你能澄清一下吗
  • 我使用了子查询因式分解子句(又名WITH)来设置一个子查询,该子查询模拟一个名为 sample_data 的表,该表包含一个数据类型为 XMLTYPE 的单列 (xml_data)。它包含一行。底部的选择显示了如何使用 xmltable 从 sample_data“表”中的 xml_data 列中提取数据。
  • 查询继续为我处理..但没有执行:(
【解决方案2】:

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

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

编辑:如@mikron 指出的那样更新

【讨论】:

  • 其实不只是区分大小写。您还应该注意 /Holding 节点,它未在您的答案中列出。所以正确的路径是/life/Holding/Policy/PlanName
  • @mikron 谢谢。您应该输入它作为答案而不是评论,以便信用可以归您所有。 :)
  • 谢谢。但是 where 子句对我不起作用。我已经编辑了我的问题
猜你喜欢
  • 2011-06-20
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2018-02-23
  • 2017-01-12
  • 1970-01-01
  • 2012-05-08
相关资源
最近更新 更多