You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle数据库CLOB中XML的<long>转<int>标签技术求助

解决方案:Oracle CLOB中XML标签替换

方案一:正则表达式替换(适合结构简单的XML)

如果你的XML结构规整,无复杂嵌套或属性,可通过REGEXP_REPLACE精准替换Relative之后的1-2个<long>标签:

UPDATE your_table
SET clob_column = REGEXP_REPLACE(
    clob_column,
    -- 拆分字符串为Relative之前和之后两部分
    '^(.*<string>Relative</string>)(.*)$',
    -- 对后半部分替换最多2次<long>为<int>
    '\1' || REGEXP_REPLACE('\2', '<long>(.*?)</long>', '<int>\1</int>', 1, 2, 'n'),
    1, 1, 'n'
)
-- 仅更新包含目标字符串的行
WHERE clob_column LIKE '%<string>Relative</string>%';

参数说明:

  • 外层REGEXP_REPLACE的'n'参数让.匹配换行符(适配跨多行的XML)
  • 内层REGEXP_REPLACE的第5个参数2限制最多替换2次,正好对应1或2个标签的场景

方案二:Oracle XML函数(推荐,适合规范XML)

正则处理XML易出现边界问题(如标签带属性、嵌套结构),用Oracle原生XML函数更可靠,能完整保留XML结构:

UPDATE your_table t
SET t.clob_column = (
    SELECT XMLSerialize(
        CONTENT 
        XMLQuery(
            'copy $tmp := . modify (
                -- 定位目标节点:Relative之后的前2个<long>
                for $n in $tmp//*[preceding-sibling::string[text()="Relative"]][self::long][position() <= 2]
                return rename node $n to "int"
            ) return $tmp'
            PASSING XMLType(t.clob_column)
            RETURNING CONTENT
        )
        AS CLOB INDENT SIZE=2 -- 保留原XML的缩进格式
    )
    FROM dual
)
WHERE t.clob_column LIKE '%<string>Relative</string>%';

逻辑说明:

  1. 用XMLType将CLOB转换为XML对象,确保正确解析
  2. XMLQuery的copy-modify语法复制原XML并修改节点:
    • 匹配所有位于<string>Relative</string>之后的<long>节点
    • 仅处理前2个符合条件的节点,重命名为<int>
  3. XMLSerialize将修改后的XML转回CLOB,保留原格式缩进

内容的提问来源于stack exchange,提问作者W33SY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:36:17