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

相关推荐
ccddsdsdfsdf6 小时前
DBeaver怎么链接mongoDB
数据库·mongodb
丷丩7 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空997 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
TheRouter8 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro8 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
JAVA面经实录9179 小时前
Hibernate面试题库
数据库·oracle·hibernate
迷枫71210 小时前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi11 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
小程故事多_8011 小时前
Claude Code自定义workflow skills用法
数据库·人工智能·智能体
大鹏说大话11 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库