0

我有一个表,其中包含一个存储为 clob 的 xml 文档。

TabA
----
Name varchar2(30) (PK)
Definition clob
other attributes

注意:“定义”是存储 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>

任何指针将不胜感激。

4

2 回答 2

0

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

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

于 2012-09-06T18:30:36.137 回答
0

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

从问题的外观来看,您似乎不仅想将 XML 与其以前的版本进行比较,而且还想找出“发生了什么变化?”。

比较和查找已更改内容的一个好方法是diff在新旧 XML 之间进行比较。是一个对CLOB. 看看您是否可以使用它来满足您的需求。

或者

您可以将其转换CLOBVarcharusing dbms_lob.substr( clob_column, for_how_many_bytes, from_which_byte );,然后执行以下操作以diff在两个新的VARCHARs-上执行

SELECT LTRIM(RTRIM(TRANSLATE('abcdef','abc',RPAD(' ',LENGTH('abcdef'))))) val
  FROM dual;

VAL
----------
def
于 2012-09-06T20:41:16.527 回答