Plsql 在Pl/Sql中解析xml格式的大文本

Plsql 在Pl/Sql中解析xml格式的大文本,plsql,xml-parsing,Plsql,Xml Parsing,我有一个日志表,该表有一个varchar2字段,其中包含xml字符串,如下所示: 在本例中,ClientName属性没有更改,但ClientName已更改。 我希望捕获更改的列及其以前的值和新值。 日志表包含数百万条记录。 您可以推荐哪种方法来有效地解析此数据 <r> <columntag nameattribute="ClientName"> <new_value>Jeffrey</new_value> <pr

我有一个日志表,该表有一个varchar2字段,其中包含xml字符串,如下所示: 在本例中,ClientName属性没有更改,但ClientName已更改。 我希望捕获更改的列及其以前的值和新值。 日志表包含数百万条记录。 您可以推荐哪种方法来有效地解析此数据

<r>
   <columntag nameattribute="ClientName">
      <new_value>Jeffrey</new_value>
      <previous_value>Jeffrey</previous_value>
   </columntag>
   <columntag nameattribute="ClientSurname">
      <new_value>Dijk</new_value>
      <previous_value>Disk</previous_value>
   </columntag>
</r>

谢谢你

我不能百分之百确定以下内容是你想要的,但它应该会给你一些关于如何去做的想法。希望对你有帮助

CREATE TABLE "RM4SERV"."LOG_TEST" ( "TESTLOG" VARCHAR2(4000 BYTE))

Insert into RM4SERV.LOG_TEST (TESTLOG) values ('<r><columntag nameattribute="ClientName"><new_value>Jeffery</new_value><previous_value>Jeffery</previous_value> </columntag><columntag nameattribute="ClientSurname"><new_value>Dijk</new_value><previous_value>Disk</previous_value></columntag></r>');
Insert into RM4SERV.LOG_TEST (TESTLOG) values ('<r><columntag nameattribute="ClientName"><new_value>Jeffery</new_value><previous_value>Jeffery</previous_value> </columntag><columntag nameattribute="ClientSurname"><new_value>Disk</new_value><previous_value>Disk</previous_value></columntag></r>');
Insert into RM4SERV.LOG_TEST (TESTLOG) values ('<r><columntag nameattribute="ClientName"><new_value>Jeffery</new_value><previous_value>Jim</previous_value> </columntag><columntag nameattribute="ClientSurname"><new_value>Dijks</new_value><previous_value>Diskett</previous_value></columntag></r>');

declare

v_logrec varchar2(4000) := null;  
v_recnum number := 0;

cursor c_logs is
select testlog from log_test;

cursor c_records is 
select extractValue(x.column_value, '/columntag/@nameattribute') as column_name,
         extractValue(x.column_value, '/columntag/new_value') as new_value,
         extractValue(x.column_value, '/columntag/previous_value') as previous_value
from TABLE(XMLSequence(extract(xmltype.createxml(v_logrec), '//columntag'))) x
where extractValue(x.column_value, '/columntag/new_value') != extractValue(x.column_value, '/columntag/previous_value');


begin
for v_log in c_logs loop
  v_logrec := v_log.testlog;
  v_recnum := v_recnum + 1;
  dbms_output.put_line(v_recnum);

  for v_rec in c_records loop
     SYS.dbms_output.put_line(v_rec.column_name || '  :  *' || v_rec.new_value || '*  :  *' || v_rec.previous_value || '*');
  end loop;

end loop;
end;
这将为您提供以下输出,因此第一条记录中的姓氏不同,第二条记录中的姓氏相同,第三条记录中的姓氏也不同

一,

客户姓氏:Dijk:Disk

二,

三,

客户名称:杰弗里:吉姆


客户姓氏:Dijks:Diskett

谢谢您的帮助!