sql - 通过 SQL 从 Oracle 中的 clob 中提取 XML 子标签

标签 sql xml oracle xpath

我在数据库属性“object_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>

目的是提取 name=”description” 的属性标签的值
=> 生成“COA_Cash_Position”

尝试了以下所有变体:

EXTRACTVALUE(xmltype(object.object_body), '/object/property[@name="description"].getStringVal()'),

如果我松开 .getStringVal() 查询可以工作,但显然只提供空结果(因为属性标记本身不包含任何值)。

获取主要错误消息,例如:

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

最简单的方法是提取两个 xml 标签之间的值,但获取特定的属性值(如此处 name="description"的标签的“值”)似乎回避了 XML 提取的可能性。

热烈感谢任何帮助...

最佳答案

EXTRACTVALUE在 Oracle 12 中已弃用 - 它被 XMLTABLE 取代或XMLQUERY .

SELECT x.description
FROM   your_table t
       CROSS JOIN
       XMLTABLE(
         '//object/'
         PASSING XMLTYPE( t.your_clob_column )
         COLUMNS description VARCHAR2(4000) PATH './property[@name="description"]/@value'
       ) x;

SELECT XMLQUERY(
         '//object/property[@name="description"]/@value'
         PASSING XMLTYPE( your_clob_column )
         RETURNING CONTENT
       ).getStringVal()
FROM   your_table;

但是如果您确实想使用EXTRACTVALUE,您可以这样做:

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

关于sql - 通过 SQL 从 Oracle 中的 clob 中提取 XML 子标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43362969/

相关文章:

java - 如何在Java中保存每个字段的变量查询结果?

c++ float to sql server DECIMAL正确转换

mysql - 连接表 (SQL)

php - 如何防止 PHP 中的 SQL 注入(inject)?

java - 在 Android 中以编程方式添加 View

php - 使用 simplexml 解析时如何忽略大小写?

Java与数据库连接

xml - 如何向 Facebook 提交错误报告?

sql - 检查行是否存在的最快方法

SQL - 如果日期连接则合并行