我正在为报告工具(Pentaho Report Designer)编写查询,我需要在其中检索存储在 Oracle 11 数据库中的一些 jpg。诀窍是慢跑(存储为 BLOB)包括一个 12 字节的标头(由另一个应用程序添加),我需要删除它。报告工具还要求将数据作为 RAW 数据返回。
我遇到了一些问题,我发现的用于操作 BLOB 的函数/过程似乎都对它们有禁止的大小/长度限制。
这个查询尽可能接近工作,使用 DBMS_LOB.SUBSTR(dbfile.filedata,2000,12):
select DBMS_LOB.SUBSTR(dbfile.filedata,2000,12) as filedata
from bms_0002005_251 safety
inner join bms_9999999_100 file02 on safety.bms_id = file02.bms_fk_0002005_839_ID
inner join bms_9999999_104 inc on safety.bms_fk_0002005_844_id = inc.bms_id
left join bms_dbfiles dbfile on file02.bms_9999999_40 = dbfile.uniqueid
对于 <= 2000 字节的图像,这可以完美运行,去除 12 字节标头并返回原始数据,如 FFD8FFE000104A46494600010201006000600000FFEE000E41646F626500640000000001...等
但是对于较大的图像(大部分图像)2000 是不够的,但是只要我将子字符串长度增加到 2001,查询就会失败:
ORA-06502: PL/SQL: numeric or value error: raw variable length too long ORA-06512: at line 1 06502. 00000 - "PL/SQL: numeric or value error%s"
这是我得到的最接近的,但长话短说 - 有没有什么方法可以在单个查询中从大 BLOB 中删除前 12 个字节并将数据作为 RAW 返回?