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

相关推荐
ClouGence10 分钟前
最基础的异构数据库 DDL 同步,我们踩过哪些坑?
数据库·mysql·postgresql
羑悻的小杀马特1 小时前
Redis持久化三剑客:RDB二进制快照、AOF文本日志、混合模式如何守护你的数据安全?
数据库·redis·缓存·aof·持久化存储·rdb
小呆爱发呆1 小时前
第三章 MySQL 库表操作
数据库·mysql·adb
时间的拾荒人2 小时前
Redis 进阶实战:渐进式遍历、持久化机制与事务详解
数据库·redis·缓存
普通人63 小时前
MySQL_FIND_IN_SET函数详解
android·数据库·mysql
真上帝的左手3 小时前
4. 关系型数据库-MySQL-Canal 进阶
数据库·mysql·canal
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
唐老板4 小时前
uuidv7 来了:为什么别再拿 uuidv4 当主键了
数据库
SelectDB17 小时前
让变更流出 Doris:Apache Doris 5.0 基于增量计算的 CDC 技术解析
数据库