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

如何在Oracle中用DBMS_LOB从BLOB列获取INVOICE_ID长类型值

提取Oracle BLOB列中的INVOICE_ID值

推荐方法:正则表达式匹配

先把BLOB转成字符类型,再用正则精准匹配INVOICE_ID =>后面的数字,不管位置怎么变都能提取:

SELECT
  REGEXP_SUBSTR(
    UTL_RAW.CAST_TO_VARCHAR2(blob_column),
    'INVOICE_ID\s*=>\s*(\d+)',
    1,
    1,
    NULL,
    1
  ) AS INVOICE_ID
FROM your_table;

适配长内容场景

如果BLOB里的内容超过VARCHAR2的4000字节限制,转成CLOB再处理:

SELECT
  REGEXP_SUBSTR(
    TO_CLOB(blob_column),
    'INVOICE_ID\s*=>\s*(\d+)',
    1,
    1,
    NULL,
    1
  ) AS INVOICE_ID
FROM your_table;

备选:修正手动偏移方式

要是你坚持用DBMS_LOB的方法,别硬编码偏移位置,动态计算截取范围:

SELECT
  UTL_RAW.CAST_TO_VARCHAR2(
    DBMS_LOB.SUBSTR(
      blob_column,
      -- 找到逗号的位置,计算要截取的长度
      INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_column), ',', INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_column), 'INVOICE_ID => ') + 13) - (INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_column), 'INVOICE_ID => ') + 13),
      -- 计算起始位置:跳过"INVOICE_ID => "的长度
      INSTR(UTL_RAW.CAST_TO_VARCHAR2(blob_column), 'INVOICE_ID => ') + 13
    )
  ) AS INVOICE_ID
FROM your_table;

关键说明

  • 正则里的\s*是用来匹配INVOICE_ID、=>前后的任意空格(包括换行、制表符),避免因为格式空格导致匹配失败。
  • 正则的最后一个参数1表示返回捕获到的数字部分,也就是(\d+)里的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:52:38