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

Oracle 检测存储为clob的xml结构中的更改,oracle,Oracle,我有一个表,其中包含存储为clob的xml文档 TabA ---- 姓名varchar2(30)(主键) 定义clob 其他属性 注意:“定义”是存储XML的clob列。 典型数据量:1500行 我的要求是执行某种类型的侦察,每天只处理那些已经更改为XML的行,并处理作为新的行。 识别新的行并只处理它们是很容易的,并且可以在名称上加上“减号”。 但是,有没有一种好的方法来识别已经发生更改的现有行中的XML 例如:如果XML中的一个元素从前一天被删除或其属性发生了更改,那么我应该能够处理“Nam

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

TabA
----
姓名varchar2(30)(主键)
定义clob
其他属性
注意:“定义”是存储XML的clob列。 典型数据量:1500行

我的要求是执行某种类型的侦察,每天只处理那些已经更改为XML的行,并处理作为新的行。 识别新的行并只处理它们是很容易的,并且可以在名称上加上“减号”。 但是,有没有一种好的方法来识别已经发生更改的现有行中的XML

例如:如果XML中的一个元素从前一天被删除或其属性发生了更改,那么我应该能够处理“Name”行

表中典型XML的示例:


名称1
更多元素标签
... 
任何指针都将不胜感激。

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


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

,只有在更新新xml之前,将以前(旧)xml的记录保存在日志或临时表中,才有可能进行比较

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

比较和发现变化的一个好方法是在新旧XML之间进行
diff
。是一个在
CLOB
上执行差异的包。看看你能不能用它来满足你的需要

您可以使用
dbms\u lob.substr(CLOB\u列,表示多少字节,来自哪个字节)将
CLOB
转换为
Varchar
然后执行如下操作,对两个新的
VARCHAR
s执行
diff
-

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

VAL
----------
def

我不是问如何处理它。我问的是如何识别XML中已更改的元素/SQL@user1617637,如果你能确切地解释为什么这个答案对你没有帮助,那会有帮助。从表面上看,您可以很容易地使用一个触发器来捕获update/insert语句,并将pk插入另一个表中,这样您就可以知道pk发生了什么变化(显然不是实际的数据)。您需要确定哪些东西对您没有帮助?同样,如前所述,我对处理更改的方法不感兴趣。这可以通过不同的方式来实现。但是,我想知道如何识别存储为clob的XML结构的更改。一旦我设法检测到特定的XML已经更改,我知道我总是可以使用PK获取该行,并将其隔离以供进一步处理。如果您阅读了我的评论跟踪,但是,此人随后编辑了他的评论,并提供了一个链接来比较2个XML(这是我正在寻找的),我仍在研究它。谢谢Emmanuel。但是,DIFF例程似乎有很多限制,并且假设了很多事情。它不符合我的要求,即仅仅确定XML是否从其前一版本更改。我不想知道在这段时间内发生了什么变化,只要我能确定它是否更改。我不想知道XML中发生了什么变化,只要我能确定它是否从其前一版本更改。如果它已更改,那么我可以使用XML的PK来重新处理该行。但是,我会调查一下你的差异程序,看看它是否合适。谢谢。我指的是包含XML列的行的PK,而不是XML的PK!要查找XML是否已更改,您可以查看日志表中是否有以前版本的XML(正如我提到的,您将使用触发器填充)。