我有一个包含存储为clob的xml文档的表。
TabA
----
Name varchar2(30) (PK)
Definition clob
other attributes
注意:“Definition”是存储XML的clob列。 典型数据量:1500行。
我的要求是进行某种重新调整,并且只处理那些已经过XML更改的行并处理那些以新的形式出现的行。 识别新的行并仅处理它们很容易,并且可以使用名称上的“减号”来完成。 但是,有没有一种很好的方法来识别已经发生变化的现有行中的XML?
例如:如果XML中的元素已被删除或其属性从前一天更改,那么我应该能够处理该“名称”行。
表中典型XML的示例:
<?xml version="1.0" encoding="UTF-8"?>
<dataMart asOfDriver="EFFECTIVE_DATE" chainedData="false" classification="" convertUsingFxRate="false" coreEntityIndicator="false" createdAt="2011-12-22T17:41:11.002" createdBy="user1" description="" entitled="false" entitlementDriver="false" hierarchicalFlag="false" innerJoin="false" intent="Intermediate" lastUpdatedAt="2012-07-26T16:11:42.424" lastUpdatedBy="p459807" martType="SPOT" martUsage="Persistent" ownerRole="Meta Model SSC" preAggregatedData="false" referenceDataIndicator="false" retention="" rollupFunction="" staticAggregationOnly="false" status="ACTIVE" tags="">
<name>Name1</name>
<sources>
<source isDefault="false" name="S1"></source>
</sources>
<rowType-mapping>
<rowType identifier="0">
<element alias="E1" name="E1" source="" sourceAlias="" sourceType="system" trackSource="false">
<description localDescription="false"></description>
<validationRule type="None"></validationRule>
<mapping columnName="E1" function="" tableName="TABA"></mapping>
<Opaque />
</element>
More element tags
...<element> </element>
</rowType>
</rowType-mapping>
<parameters>
<parameter filter="N" name="P1">
<![CDATA[PM]]>
</parameter>
</parameters>
</dataMart>
任何指针都会非常感激。
答案 0 :(得分:0)
答案 1 :(得分:0)
只有在更新新XML之前,才能在日志或临时表中保留先前(旧)xml的记录。
通过问题的外观,您似乎不仅希望将XML与其先前版本进行比较,还要查找“已发生变化的内容?”。
比较和查找已更改内容的一种好方法是在旧XML和新XML之间执行diff
。 Here是一个在CLOB
上执行差异的包。看看你是否可以使用它来满足你的需求。
或者
您可以使用CLOB
将Varchar
转换为dbms_lob.substr( clob_column, for_how_many_bytes, from_which_byte );
,然后执行以下操作,在两个新的diff
s上执行VARCHAR
/ p>
SELECT LTRIM(RTRIM(TRANSLATE('abcdef','abc',RPAD(' ',LENGTH('abcdef'))))) val
FROM dual;
VAL
----------
def