Oracle:将包含属性(Attributes)的 XML 数据解析为表格数据

xml片段:

<feeitemarray>

<feeitem itemno="0" recipeno="" hiscode="sw001" itemname="" itemtype="0" unitprice="7.5" count="100" fee="750" dose="剂型" specification="规格" unit="单位" howtouse="用法" dosage="单次用量" packaging="包装单位" minpackage="最小包装" conversion="换算率" days="天数" babyflag="0" drugapprovalnumber ="药品批准文号" packflag="1" nation_subject_code = "国家收费项目编码" SPE_USE_FLAG ="1"/>

</feeitemarray>

在 Oracle 数据库中,将包含属性(Attributes)的 XML 数据解析为表格数据,主要使用 XMLTABLE函数。通过 XPath 表达式提取各个字段。

以下是具体的 SQL 实现方案:

‌使用 XMLTABLE‌:这是 Oracle 处理 XML 最标准且高效的方法。

‌定位节点‌:XPath 指向 /recipearray/feeitemarray/feeitem。

‌映射属性‌:在 COLUMNS 子句中,使用 @属性名 的方式提取 XML 标签内的属性值。

‌数据类型转换‌:根据业务需求,将字符串转换为数字(如 unitprice, count)或日期等类型。

SQL 示例代码

假设 XML 数据存储在一个名为 xml_data 的 CLOB 列中,或者作为一个变量传入:

SELECT

x.itemno,

x.hiscode,

x.itemname,

x.itemtype,

x.unitprice,

x.count,

x.fee,

x.dose,

x.specification,

x.unit,

x.howtouse,

x.dosage,

x.packaging,

x.minpackage,

x.conversion,

x.days,

x.babyflag,

x.drugapprovalnumber,

x.packflag,

x.nation_subject_code,

x.spe_use_flag

FROM

your_table_name t,

XMLTABLE(

'/feeitemarray/feeitem'

PASSING XMLType(t.xml_column) -- 这里替换为实际的XML列名或XMLType变量

COLUMNS

itemno NUMBER PATH '@itemno',

recipeno VARCHAR2(50) PATH '@recipeno',

hiscode VARCHAR2(50) PATH '@hiscode',

itemname VARCHAR2(200) PATH '@itemname',

itemtype NUMBER PATH '@itemtype',

unitprice NUMBER(10, 2) PATH '@unitprice',

count NUMBER PATH '@count',

fee NUMBER(10, 2) PATH '@fee',

dose VARCHAR2(50) PATH '@dose',

specification VARCHAR2(100) PATH '@specification',

unit VARCHAR2(20) PATH '@unit',

howtouse VARCHAR2(200) PATH '@howtouse',

dosage VARCHAR2(50) PATH '@dosage',

packaging VARCHAR2(50) PATH '@packaging',

minpackage VARCHAR2(50) PATH '@minpackage',

conversion NUMBER PATH '@conversion',

days NUMBER PATH '@days',

babyflag NUMBER PATH '@babyflag',

drugapprovalnumber VARCHAR2(100) PATH '@drugapprovalnumber',

packflag NUMBER PATH '@packflag',

nation_subject_code VARCHAR2(50) PATH '@nation_subject_code',

spe_use_flag NUMBER PATH '@SPE_USE_FLAG'

) x;

关键注意事项

‌空值处理‌:

如果某个属性在 XML 中不存在,XMLTABLE 对应的列将返回 NULL。建议在应用层或 SQL 中使用 NVL 函数处理默认值。

‌性能优化‌:

对于大量 XML 数据的解析,确保存储 XML 的列类型为 XMLType 而非 CLOB,这样可以利用 Oracle 的二进制 XML 存储特性,显著提升解析速度。如果必须是 CLOB,Oracle 也会自动转换,但开销稍大。

相关推荐
泡海椒8 小时前
JQuick-Excel JQuickRow 数据准备实战:JObjectConverter、JQuickRow.toRows 与 XML 导出链路
xml·windows·excel
jyOverQ8 小时前
MySQL 崩溃以后怎么恢复数据?redo log、undo log 与 Crash Recovery
数据库·mysql
盟道科技8 小时前
电商小程序购物车系统设计:缓存与数据库双写一致性实战
数据库·缓存·小程序
java1234_小锋8 小时前
【技术专题】Mysql8 数据库 - Mysql8 客户端sqlyog安装以及配置
数据库·sqlyog
奇牙coding8 小时前
Codex C接 配置教程:的 字段从迁移时必须写完整后缀,填旧值或省略 会静默回退默认模型
java·c语言·数据库·ai
Nturmoils8 小时前
别急着 JOIN,子查询有些场景更顺手
数据库
喜欢的名字被抢了8 小时前
09-Redis 进阶原理篇:单线程、多线程、过期、LRU-LFU、Fork 与 Lua
数据库·redis·lua
Omics Pro9 小时前
计算虚拟扰动:网络毒理+虚拟敲除
数据库·人工智能·算法·机器学习·自然语言处理
白帽攻防录17 小时前
SRC 挖洞:Roundcube 预认证 SQL 注入深度复盘,CVE-2026-48842 preg_replace 转义绕过怎么打穿邮件系统
网络·数据库·sql·网络安全·sql注入
꯭自꯭闭꯭18 小时前
达梦SQL优化相关
linux·运维·数据库·sql