Oracle:将包含属性(Attributes)的 XML 数据解析为表格数据
xml片段:
<feeitemarray>
<feeitemitemno="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 也会自动转换,但开销稍大。
