检测存储为clob的xml结构中的更改

时间:2012-09-06 18:24:02

标签: oracle

我有一个包含存储为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>

任何指针都会非常感激。

2 个答案:

答案 0 :(得分:0)

我建议使用trigge r将更改的项目记录到另一个表格中。处理特定日期记录在日志表中的内容。

关于如何比较两个XML,请参考this

答案 1 :(得分:0)

只有在更新新XML之前,才能在日志或临时表中保留先前(旧)xml的记录。

通过问题的外观,您似乎不仅希望将XML与其先前版本进行比较,还要查找“已发生变化的内容?”。

比较和查找已更改内容的一种好方法是在旧XML和新XML之间执行diffHere是一个在CLOB上执行差异的包。看看你是否可以使用它来满足你的需求。

或者

您可以使用CLOBVarchar转换为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