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 小时前
Oracle 19c数据库内存管理优化(内存管理方式调整及内存扩容)
数据库·oracle·oracle数据库集群调优
CQU_JIAKE8 小时前
9.10【A】
数据库
乐观的Terry8 小时前
Redis生产环境redis-conf配置教程
数据库·redis
SeaTunnel8 小时前
Redis 数据迁移不用写脚本:SeaTunnel 支持 String、Hash、Set、ZSet 四种数据类型
数据库·redis·哈希算法·数据迁移·seatunnel·数据同步
晊晌_h8 小时前
嵌入式从0到精通——SQLite3 数据库
数据库·sqlite·sqlite3
海浪仙人掌9 小时前
账龄分析怎么操作?账龄分析实施流程有哪些步骤?
数据库
楚枫默寒9 小时前
Oracle AWR 自动巡检报告
数据库·oracle
吉甫作诵9 小时前
Oracle 19c 常用运维命令大全
运维·数据库·oracle
宗介波妞9 小时前
主站与场站多业务链路通断测试实战指南(电力自动化联调)
网络·数据库
邪修king9 小时前
MySQL数据库(二):操作详解:从创建、查看到备份恢复
数据库·mysql