(原创)从CLOB字段的XML中提取关系数据研究

从CLOB字段的XML中提取关系数据研究
本文中用以下函数:extract、extractvalue、existsnode、xmlsequence、xmltype、Xmltable、XMLQuery,函数的具体的语法在此不作描述。
在提取数据之前先要把CLOB数据用xmltype函数据转换为XML数据。
1.XML中的数据是单表且只一行数据。
这种情况很简单且速度很快。示例如下:
SELECT
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/action_code') action_code,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/route_id') route_id,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/route_actn_code') route_actn_code,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/deal_org_code') deal_org_code,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/office_code') office_code  ,
  to_date(extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/deal_datetime'),'yyyy-mm-dd hh24:mi:ss') deal_datetime,
  to_date(extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/act_datetime'),'yyyy-mm-dd hh24:mi:ss') act_datetime,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/post_way_code') post_way_code,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/route_kind_code') route_kind_code,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/bag_count') bag_count,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/bag_weight_sum') bag_weight_sum,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/flight_info') flight_info ,
  to_date(extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/create_time'),'yyyy-mm-dd hh24:mi:ss') create_time
FROM ( SELECT  XMLTYPE(v_msg) v_msg,d_in_time FROM run$log)
WHERE existsnode(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info') =1;

2.XML中的数据是主从表关系。
这种情况下,在抽取子表时必须用xmlsequence函数转换为nest table,否则会报ora-22905。另如果从表的数据量达到千数量级时速度很慢。
  2.1使用table()函数xmlsequence
示例如下:
SELECT
  extractvalue(VALUE(t),'/bag/end_org_code') end_org_code,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/route_id') route_id,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/route_actn_code') route_actn_code,
  extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/deal_org_code') deal_org_code,
  to_date(extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/deal_datetime'),'yyyy-mm-dd hh24:mi:ss') deal_datetimed,
  to_date(extractvalue(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/act_datetime'),'yyyy-mm-dd hh24:mi:ss') act_datetime,
  extractvalue(VALUE(t),'/bag/bag_action') bag_action,
  extractvalue(VALUE(t),'/bag/bag_id') bag_id,
  extractvalue(VALUE(t),'/bag/label_strip') label_strip,
  extractvalue(VALUE(t),'/bag/start_org_code') start_org_code
FROM ( SELECT  XMLTYPE(v_msg) v_msg,d_in_time FROM run$log) ,
  TABLE(xmlsequence(extract(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/bags/bag'))) t;
  2.2使用xmltable()和xmlquery()函数

这两个函数的用法不再描述,具体可查官方文档:http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14259/xdb_xquery.htm
使用这两个函数时必须安装oracle xml db.这种方法比2.1快50%.示例如下:
SELECT extractvalue(v_msg,'/gpdic_xml/bag_detail_infos/bag_detail_info/bag_id') bag_id,
      xtab.mail_num ,xtab.mail_action,xtab.mail_remark_code,xtab.mail_other_remark
FROM run$log_test,
      Xmltable('for $j in /gpdic_xml/bag_detail_infos/bag_detail_info/mails/mail
                return $j'
                PASSING v_msg
                COLUMNS mail_num VARCHAR2(20) PATH '/mail/mail_num',
                        mail_action VARCHAR2(1) PATH '/mail/mail_action',
                        mail_remark_code VARCHAR2(20) PATH '/mail/mail_remark_code',
                        mail_other_remark VARCHAR2(50) PATH '/mail/mail_other_remark') xtab
WHERE existsnode(v_msg,'/gpdic_xml/bag_detail_infos/bag_detail_info') >0;

补充一下:

以上SQL中的TABLE(xmlsequence(extract(v_msg,'/gpdic_xml/route_detail_infos/route_detail_info/bags/bag'))) t的/gpdic_xml/route_detail_infos/route_detail_info/bags/bag为XML的从表路径。

时间: 2024-10-22 14:06:40

(原创)从CLOB字段的XML中提取关系数据研究的相关文章

属性(Properties)和字段在C#中的关系

主题:这篇文章我来说下属性(Properties)和字段在C#中的关系.首先申明一下,这里讲的属性就是通 常说的包含get,或者是set访问器的属性,不是属性 (Attribute).我们写程序的时候大多都会用到实体 类,而生成实体类,我们都会申明一些常规属性或者是自动实现的属性.至于到底选用哪一种属性,或者 说是否可以直接用字段代替呢? 常规属性和自动实现属性的区别: 一个完整的常规属性由以下几部分构成: 1:私有字段,用来存储变量(后备存储),这个字段之所以是私有的,是为了让它只能通过属性来

快速从excel中提取office数据宏实现方法

方法一:利用快捷键逐个提取 这个实例的效果是:点选要提取数据的单元格后,只要按一下Ctrl+d键,数据就自动拷贝到你指定的位置,并且可以连续操作,后拷贝的数据会自动顺延到指定位置的下一单元格中. Step1 启动Excel新建一个文件,保存为DataCenter.xls.点击"工具→宏→录制新宏"菜单命令,设置宏名为CopyRange,快捷键设为Ctrl+d(注意:不要跟系统的快捷键冲突),点击"确定"按钮. Step2 点击"工具→宏→停止录制"

Excel在大量数据中提取特定数据

自学考试考生成绩公布了,但上级下发到各报名点的是全地区所有考生的总成绩zcj.dbf,有80多万条记录,5万多名考生,而我们报名点参加考试的只有800多人,怎么从这"茫茫人海"中挑出我们考生的成绩呢? 情况分析 1.根据zcj.dbf中的字段不能区分各报名点. 2.我们报名点的考生准考证号并不连续,用附加条件的删除记录方法,不能完全准确地剔除其他报名点考生. 解决方案 1.先从<高等教育自学考试考务管理系统·报考系统>中导出考生信息,生成文件ks.dbf. 具体方法:启动F

Excel技巧:在大量数据中提取特定数据

自学考试考生成绩公布了,但上级下发到各报名点的是全地区所有考生的总成绩zcj.dbf,有80多万条记录,5万 多名考生,而我们报名点 参加考试的只有800 多人,怎么从这"茫茫人海"中挑出我们考生的成绩呢? 情况分析 1. 根据zcj.dbf中的字段不能区分各报名点. 2. 我们报名点的考生准考证号并不连续,用附加条件的删除记录方法,不能完全准确地剔除其他报名点考生. 解决方案 1. 先从<高等教育自学考试考务管理系统·报考系统>中导出考生信息,生成文件ks.dbf. 具体

Excel2013如何从数据源中提取条件数据

  1.启动Excel2013,我们先在源数据表中A2单元格输入下面的公式,B1单元格要进行绝对引用,然后查询表中C1单元格同样如此. 2.回车键按下,得到结果1,双击填充柄,将表格中余下数据一并填充完整. 3.返回到查询表中,单击A4单元格,输入公式,稍后我跟大家说明. 4.按下键盘上的Enter回车键,A4单元格显示结果为华东. 5.鼠标左键按住填充柄,向右拉,将整行填充,得到华东地区的第一条数据. 6.选中这行数据,向下填充,可以将原始表格中华东地区的数据情况全部显示出来.

如何读取该xml中的相关数据

问题描述 有这样一个xml文件:http://gdata.youtube.com/feeds/api/videos?vq=apple&orderby=viewCount&max-results=20&start-index=1我想读出一下3条内容.请问如何读取.<media:titletype="plain">xxxxxxxxxxxxx</media:title><media:playerurl="http://www.y

clob-请问PHP如何读取Oracle数据库中的CLOB字段?

问题描述 请问PHP如何读取Oracle数据库中的CLOB字段? 请问PHP如何读取Oracle数据库中的CLOB字段?数据库中CLOB字段中是文本内容. 试了N多次,都没用,还望各位大神不吝赐教,感谢!

XML中二进制数据的处理方法

xml|二进制|数据 在xml中,所有的数据都是以文本的形式来显示,但是二进制数据不能直接以文本格式来表示,那xml又是怎么处理二进制数据的呢?下面就来探讨一下. 为了简单和通用性,xml被设计成了以文本的格式来表示数据.在xml中,所有的数据都是以文本的格式来存储,二进制数据也不例外.在xml中,二进制数据也要被编码成文本的格式,发送到目的方.目的方接收到这个文本二进制数据以后,再以相同的解码程序解成相应的二进制数据,当然数据原来的格式,名称等辅助信息一定要当作相关信息一起发送.一般二进制数据

应用 XML 管理层次结构的数据

xml|数据 引言 现实世界中大量的数据都具有层次结构,常见的例子包括组织机构序列(如公司机构.部队编制.作战编成).分类体系(如中图分类法.装备体系).家族谱系等等.因此,层次结构数据的管理,在软件开发过程当中经常会遇到,是个具有共性的问题. 数据管理是指如何对数据进行分类.组织.编码.存储.检索.控制和维护,是数据处理的中心问题.关系数据库管理系统通过索引.查询优化.事务处理.并发访问控制.触发器.错误恢复等强大的机制,有效地确保了海量数据存取的高效性,保证了数据的完整性和一致性,并提供了数