oracle11g:提取和计算XML元素

oracle11g:提取和计算XML元素,xml,oracle,xquery,Xml,Oracle,Xquery,我将XML类型的数据存储在Oracle 11g数据库中。我的数据的粗略版本如下所示: <?xml version="1.0" encoding="UTF-8"?> <record> <record_number>12345</record_number> <record_type> book </record_type> </record> 指定列,其中每行包含格式良好的XML文件,其中包含许多标记和元素。我正

我将XML类型的数据存储在Oracle 11g数据库中。我的数据的粗略版本如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<record>
<record_number>12345</record_number>
<record_type> book </record_type>
</record>
指定列,其中每行包含格式良好的XML文件,其中包含许多标记和元素。我正在努力提取和计算每个元素的出现次数。例如,我想知道XML标记包含“book”、“article”等元素的次数。但是,我不知道与标记关联的元素的完整列表

谢谢


I.

具体取决于数据的存储方式,即表中是否有一行是一个类似于您发布的示例的XML文档,或者表中是否有一行是一个包含许多不同记录标记的XML文档最简单的方法是

SQL> ed
Wrote file afiedt.buf

  1  with t as (select '<?xml version="1.0" encoding="UTF-8"?>
  2                     <record>
  3                       <record_number>12345</record_number>
  4                       <record_type> book </record_type>
  5                     </record>' xml
  6                from dual
  7              union all
  8              select '<?xml version="1.0" encoding="UTF-8"?>
  9                        <record>
 10                           <record_number>6789</record_number>
 11                           <record_type> magazine </record_type>
 12                        </record>' xml
 13                 from dual)
 14  select xmltype(t.xml).extract( '//record_number/text()' ) record_number,
 15         xmltype(t.xml).extract( '//record_type/text()' ) record_type
 16*   from t
SQL> /

RECORD_NUMBER        RECORD_TYPE
-------------------- ------------------------------
12345                 book
6789                  magazine

一旦你提取了数据,就可以很容易地计算或聚合数据。

Justin,谢谢你的回复,不幸的是,我似乎没有意识到这一点。数据存储在“元数据”表中名为“XML类型”的列下,每一行都是一个精心编制的XML元数据文件是的,有几个记录标记。你能补充一些关于你的代码实际作用的细节吗?真的很感谢,很抱歉我对XQuery一无所知。。。
SQL> ed
Wrote file afiedt.buf

  1  with t as (select '<?xml version="1.0" encoding="UTF-8"?>
  2                     <record>
  3                       <record_number>12345</record_number>
  4                       <record_type> book </record_type>
  5                     </record>' xml
  6                from dual
  7              union all
  8              select '<?xml version="1.0" encoding="UTF-8"?>
  9                        <record>
 10                           <record_number>6789</record_number>
 11                           <record_type> magazine </record_type>
 12                        </record>' xml
 13                 from dual)
 14  select xmltype(t.xml).extract( '//record_number/text()' ) record_number,
 15         xmltype(t.xml).extract( '//record_type/text()' ) record_type
 16*   from t
SQL> /

RECORD_NUMBER        RECORD_TYPE
-------------------- ------------------------------
12345                 book
6789                  magazine