Oracle增加、更新、删除、查询xml节点

这里整理下项目开发中用到了SQL对数据库中XML类型字段增删改查的操作,好记性不如烂笔头,特此整理如下。
1、Oracle更新XML字段的方式整理如下:
方式一(针对字段形如 ):
操作DAT_DOCUMENT表,更新为生产测试设备

update DAT_DOCUMENT t
    set DOCUMENT_DATA = UpdateXML(t.DOCUMENT_DATA,
                                  '/root/serviceObject',
                                  '<serviceObject>生产测试设备</serviceObject>')
  where  t.form_name = 'PD00007' 

方式二(针对字段形如 ):

update DAT_DOCUMENT t
    set DOCUMENT_DATA = UpdateXML(t.DOCUMENT_DATA,
                                  '/root/serviceObject',
                                  '<serviceObject>' || '生产测试设备' || '</serviceObject>')
  where  t.form_name = 'PD00007' 

方式三(动态替换字段,将xml中text_useCompany_display值替换成empCompany值)

update DAT_DOCUMENT d
    set DOCUMENT_DATA = UpdateXML(d.DOCUMENT_DATA,
                                  '/root/text_useCompany_display',
                                  '<text_useCompany_display datatype="text" vtype="value">' || extractvalue(d.document_data,'/root/empCompany') || '</text_useCompany_display>')
  where d.form_name = 'PD00007'

oracle中"||“用于拼接字符串,相当于SQLServer中的字符串的连接符”+"
2、Oracle删除XML字段的方式整理如下:
删除root目录下的printFlag字段

UPDATE DAT_DOCUMENT t SET DOCUMENT_DATA =
   DELETEXML(DOCUMENT_DATA,
   '/root/printFlag')
   WHERE   t.form_name = 'PD00007'

3、Oracle查询XML字段的方式整理如下:
从DAT_DOCUMENT中查询POSNR,KWMENG,VBELN字段

select EXTRACTVALUE(DOCUMENT_DATA, '/root/POSNR') as POSNR,
       EXTRACTVALUE(DOCUMENT_DATA, '/root/KWMENG') as KWMENG,
       EXTRACTVALUE(DOCUMENT_DATA, '/root/VBELN') as VBELN
  from DAT_DOCUMENT t

如果需要查询处理重复节点,可以利用extract函数中路径引用text(),查询的节点若重复则自动拼接

select extractvalue(xmltype('<a><b>1</b><b>2</b></a>'),'/a/b') from dual;  -- 报错,报只返回一个节点值,因为在a标签下存在两个同名标签b
select extract(xmltype('<a><b>1</b><b>2</b></a>'),'/a/b/text()') from dual; -- extract+text() 解决同名节点问题,若存在重复节点会自动拼接在一起,但不使用任何拼接符号

4、Oracle增加XML字段的方式整理如下:
在DAT_DOCUMENT表中增加versions字段

UPDATE DAT_DOCUMENT t
   SET DOCUMENT_DATA = INSERTCHILDXML(DOCUMENT_DATA,
                                      '/root',
                                      'versions',
                                     XMLType('<versions>v3</versions>'))
 WHERE t.form_name = 'SD16'

注意多行更新,字段之间用逗号分隔,比如:

##更新ARRIVAL_TIME和CREATE_TIME两个字段
update BPM_AUDIT_RECORD b
   set ARRIVAL_TIME = to_date('2020-06-19 19:05:25', 'YYYY-MM-DD HH24:MI:SS'),
       CREATE_TIME  = to_date('2020-06-19 19:05:25', 'YYYY-MM-DD HH24:MI:SS')
 where b.document_id = 'docid:633e3951-a5e3-4871-b7e4-092afd0c8954'
   and b.record_id = 'bpm_audrec:85682894-61af-41e3-aeec-a1b0efbe3012'

参考博客
https://www.cnblogs.com/king-xg/p/8652303.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值