我在数据库属性“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”提取属性标记的值
=&GT;生成“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”]中的令牌无效。 getStringVal()'
在两个xml标记之间提取值但是获取特定属性值(比如这里带有name =“description”的标记的“值”)似乎可以避免XML提取的可能性。
热烈欢迎任何帮助...
答案 0 :(得分:1)
EXTRACTVALUE
- 它被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;
答案 1 :(得分:0)
假设你的意思是@value属性的值,你想要的路径是
/object/property[@name='description']/@value
答案 2 :(得分:-1)
您的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
点击此处Demo。
输出IS: COA_Cash_Position