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 也会自动转换,但开销稍大。

相关推荐
@小匠1 小时前
Redis RDB持久化之 save 自动备份检查机制
数据库·redis·bootstrap
折哥的程序人生 · 物流技术专研2 小时前
从“卡死”到“跑通”:WMS机器学习全流程实战排坑记
数据库·人工智能·机器学习
上海云盾商务经理杨杨2 小时前
Web渗透核心漏洞:SQL注入漏洞测试与修复实战
数据库·sql·安全
2303_821287382 小时前
c++ RAII机制详解 c++如何利用RAII管理资源
jvm·数据库·python
小宇的天下2 小时前
Calibre 3Dstack --每日一个命令day25【no_trace】(3-25)
数据库
m0_624578593 小时前
C#怎么获取U盘的插拔事件_C#如何重写WndProc捕获消息【进阶】
jvm·数据库·python
消失的旧时光-19433 小时前
SQL 第四篇:JOIN 实战(数据库到底是怎么“拼表”的)
数据库·sql·mysql
深蓝轨迹4 小时前
Spring Data JPA 实战指南:从基础配置到高级技巧
数据库·oracle·spring data jpa
爱喝水的鱼丶4 小时前
SAP-ABAP:SAP 与 ABAP 关联逻辑与入门路径:业务×开发的协作指南
服务器·前端·数据库·学习·sap·abap