Oracle SQL – 如何从BLOB中删除前导字节(并以RAW形式返回)?

我正在编写一个报告工具(Pentaho Report Designer)的查询,我需要检索一些存储在Oracle 11数据库中的jpgs.诀窍是慢跑(存储为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字节头并返回原始数据,如
FFD8FFE000104A464946000102010

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

600000FFEE000E41646F626500640000000001 ……等

但是对于较大的图像(大多数图像)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返回?

最佳答案
一般来说,考虑到ORA-14553,无法在查询中即时修改blob.
Blob变量是指向数据的指针,但不是数据本身.
这就是为什么像DBMS_LOB.SUBSTR这样的函数不返回BLOB或CLOB,而是返回RAW或CHAR – 因为最后类型的数据(变量)
可直接在RAM中使用.

因此,为了查询修改的blob(从头部切掉12个字节),我们需要在查询之前创建和存储修改后的blob.根据业务需求,可以在适当的位置或通过创建新blob来保留原件.在问题的情况下,我想我们无法修改原始blob.

显然,第二种方式(保留原件)是更加资源密集的方式.

解决方案的大局:

>确定要查询的blob列表
>对于列表中的每个项目,创建并存储修改后的blob(例如,修剪为12个字节),其中id为原始链接
>运行查询返回修改后的blob
>删除修改的blob(消耗后立即消耗或按计划消耗)

这会导致比解决的问题更多的问题:

>需要清理修改的blob
>同步原始和修改
>将存储数据量加倍
>另一个惊喜

我想有一个不那么痛苦的解决方案 – 在外部方编写代码,使用查询结果并修改数据库的blob数据.

转载注明原文:Oracle SQL – 如何从BLOB中删除前导字节(并以RAW形式返回)? - 代码日志