Oracle中如何将CLOB存储的XML转换为动态数据表?
Oracle中动态关联XML CLOB里的name与equation字段
要实现XML中name和equation下的<string>节点按顺序一一对应转换为数据表,可以利用Oracle XMLTable的FOR ORDINALITY特性生成节点位置序号,通过序号关联两组节点。
解决方案SQL
SELECT d.profile_name, names.name_val, equations.equation_val FROM ( -- 将CLOB转换为XMLType,同时去重profile_name SELECT DISTINCT profile_name, XMLTYPE(my_clob) AS xml_data FROM mytable WHERE profile_name LIKE 'A' ) d -- 提取所有name下的<string>节点并生成位置序号 CROSS JOIN XMLTable( '/formula/name/string' PASSING d.xml_data COLUMNS seq_num FOR ORDINALITY, -- 生成从1开始的节点位置序号 name_val VARCHAR2(100) PATH '.' -- 提取<string>的文本内容 ) names -- 通过序号关联对应的equation节点 JOIN XMLTable( '/formula/equation/string' PASSING d.xml_data COLUMNS seq_num FOR ORDINALITY, equation_val VARCHAR2(200) PATH '.' ) equations ON names.seq_num = equations.seq_num;
核心逻辑说明
FOR ORDINALITY:自动为XMLTable返回的每一行生成递增序号,序号对应节点在父节点下的位置(第一个<string>节点序号为1,第二个为2,以此类推)。- 分别用两个XMLTable提取
name和equation下的所有<string>节点,再通过序号seq_num关联,即可实现两组节点的按序一一匹配,适配节点数量动态变化的场景。
额外说明
如果XML中name和equation下的<string>节点数量不一致,可将JOIN改为LEFT JOIN或RIGHT JOIN,保留不匹配的记录,具体根据业务需求调整。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

