通过SQL从Oracle中的clob中提取XML子标记

通过SQL从Oracle中的clob中提取XML子标记,sql,xml,oracle,xpath,Sql,Xml,Oracle,Xpath,我在DB属性“object\u body”中有以下CLOB XML片段: <object stamp="8fc630bd-f1f5-43ac-b9d2-3b9db9054c75_1481811010527" type="Aggregation" version="12"> <property name="name" value="COA_Cash_Position" valueType="string"/> <property name="descripti

我在DB属性“object\u body”中有以下CLOB XML片段:

<object stamp="8fc630bd-f1f5-43ac-b9d2-3b9db9054c75_1481811010527" type="Aggregation" version="12">
  <property name="name" value="COA_Cash_Position" valueType="string"/>
  <property name="description" value="COA_Cash_Position" valueType="string"/>
  <property name="objectId" value="ef4296f1-6af6-4de8-83fe-fa01cf327d87" valueType="string"/>
  <property name="branchId" value="01ecc9ed-27f3-42cb-a44d-2cec221ec8fa" valueType="string"/>
  <property name="models" valueType="table">
    <object type="ModelBasedTask:modelEntry" version="3">
      <property name="dataModel" valueType="url">DataModel["ModifyModel[COA_Cash_Positions_BHS_Unadjusted].STAGING:X_NRS_BSL40K_BHS"{ModifyModel[ff81e5f2-2ef6-437a-b113-67f7c0dd5e53].cdf308fc-520d-4611-a8db-4e6863e216b8:9ffcd08e-732a-4270-b15f-f4775bcc69db}]</property>
      <property name="instanceSelectionRule" valueType="object">
        <object type="InstanceSelectionRule" version="3">
          <property name="instanceDateRule" valueType="object">
            <object type="InstanceSelectionRule:rule" version="3">
              <property name="type" value="EQUAL" valueType="string"/>
            </object>
          </property>
          <property name="instanceKeyRules" valueType="table"/>
        </object>
      </property>
    </object>
  </property>
</object>
如果我丢失了.getStringVal(),查询将工作,但显然只提供空结果(因为属性标记本身不包含任何值)

获取以下类型的错误消息:

ORA-31011:XML解析失败 ORA-19202:XML处理中发生错误 LPX-00601:“/object/property[@name=“description”]中的令牌无效。 getStringVal()

简单的方法是提取两个xml标记之间的值,但获取特定的属性值(如此处带有name=“description”的标记的“value”)似乎避开了xml提取的可能性


非常感谢您的帮助

假设您指的是所需路径的属性@value的值

/object/property[@name='description']/@value

假设您的意思是所需路径的属性@value的值

/object/property[@name='description']/@value
在Oracle 12中已弃用-它将被或取代

但如果您确实想使用
EXTRACTVALUE
,您可以:

SELECT EXTRACTVALUE(
         XMLTYPE( your_clob_column ),
         '//object/property[@name="description"]/@value'
       )
FROM   your_table;
在Oracle 12中已弃用-它将被或取代

但如果您确实想使用
EXTRACTVALUE
,您可以:

SELECT EXTRACTVALUE(
         XMLTYPE( your_clob_column ),
         '//object/property[@name="description"]/@value'
       )
FROM   your_table;

您的XML包含一些错误。 我们可以在oracle中使用REGEXP实现您的预期输出。 检查下面的查询

 SELECT REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_SUBSTR (object_body, 'description" value=".*.".v', 1), 'description" value="', '', 1, 1) ,'" v','',1,1)   
 FROM Table
在这里检查


输出为:
COA\u Cash\u Position

您的XML包含一些错误。 我们可以在oracle中使用REGEXP实现您的预期输出。 检查下面的查询

 SELECT REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_SUBSTR (object_body, 'description" value=".*.".v', 1), 'description" value="', '', 1, 1) ,'" v','',1,1)   
 FROM Table
在这里检查



输出为:
COA\u Cash\u Position

您的xml不好。它包含错误。ORA-19202错误是因为您试图在Xpath中使用getStringVal()。它不是Xpath函数,而是XMLType对象上的Oracle函数。@MT0是否确定正确放置了封闭标记?我可以用两种方法修复它,这是正确的,只有作者知道。@Seyran修复的语义与问题答案的正确性无关-示例可以剥离到最低限度,所有嵌套对象都可以剥离,但仍然不会影响答案。您的xml不好。它包含错误。ORA-19202错误是因为您试图在Xpath中使用getStringVal()。它不是Xpath函数,而是XMLType对象上的Oracle函数。@MT0是否确定正确放置了封闭标记?我可以用两种方法修复它,这是正确的,只有作者知道。@Seyran修复的语义独立于问题答案的正确性-示例可以剥离到最低限度,所有嵌套对象都可以剥离,但仍然不会影响答案。如果
名称
属性交换了吗?XML仍然具有与该标记完全相同的属性和含义,但您的查询将中断。或者,如果在
名称
属性之间的标记中添加了另一个属性。或者,如果在
标记之前添加了另一个标记,则根据requirement@MT0更改查询。重点不是需求已更改,而是需求相同,数据已更改顺序,但未更改数据的语义。使用XPATH,对于我在前面的注释XML中介绍的3种情况中的任何一种,都会得到正确的答案,但正则表达式不会。除非在有限的情况下,正则表达式是(见前3个答案)。亲爱的博萨莱先生,谢谢你的回答。不幸的是,虽然您的解决方案工作得很好,但XML非常混乱,多次包含相同的属性名称(描述)。我只对每个record/clob对象中的第一个事件感兴趣。@TomDebus欢迎您。我给出了另一个解决方案,而不是XML。如果它起作用,那么标记plz或VOTE如果交换
名称
属性会发生什么?XML仍然具有与该标记完全相同的属性和含义,但您的查询将中断。或者,如果在
名称
属性之间的标记中添加了另一个属性。或者,如果在
标记之前添加了另一个标记,则根据requirement@MT0更改查询。重点不是需求已更改,而是需求相同,数据已更改顺序,但未更改数据的语义。使用XPATH,对于我在前面的注释XML中介绍的3种情况中的任何一种,都会得到正确的答案,但正则表达式不会。除非在有限的情况下,正则表达式是(见前3个答案)。亲爱的博萨莱先生,谢谢你的回答。不幸的是,虽然您的解决方案工作得很好,但XML非常混乱,多次包含相同的属性名称(描述)。我只对每个record/clob对象中的第一个事件感兴趣。@TomDebus欢迎您。我给出了另一个解决方案,而不是XML。如果它的工作然后是mark plz或VoteTanks MTO,这正是我所寻找的。其他人也提供了很大的帮助,但我同意XPATH替代方案是最可靠的,特别是如果我有许多大型和自动生成的(因而是混乱的)XML对象的话。再次感谢您……快到了——;=)如果XML的构造与我正在处理的一样混乱,那么就会出现新的问题:
是否有XPATH方法只选择第一个属性name=“description”,而不选择后续属性(在同一个单记录XML对象中)?@TomDebus
'//object/property[@name=“description”][1]/@value'
非常感谢,这实际上解决了我的问题。作为下一个学习目标,我们必须深入研究XPath。再次感谢你的帮助。谢谢MTO,这正是我想要的。其他人也提供了很大的帮助,但我同意XPATH替代方案是最可靠的,特别是如果我有许多大型的