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,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字节头并返回原始数据,如 select DBMS_LOB.SUBSTR(dbfile.filedata,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,查询就会失败:
这是我最接近的,但长话短说 – 在单个查询中是否有任何方法我可以从大型BLOB中删除前12个字节并将数据作为RAW返回? 解决方法一般来说,考虑到ORA-14553 ,无法在查询中即时修改blob.
Blob变量是指向数据的指针,但不是数据本身. 这就是为什么像DBMS_LOB.SUBSTR这样的函数不返回BLOB或CLOB,而是返回RAW或CHAR – 因为最后类型的数据(变量) 可直接在RAM中使用. 因此,为了查询修改的blob(从头部切掉12个字节),我们需要在查询之前创建和存储修改后的blob.根据业务需求,可以在适当的位置或通过创建新blob来保留原件.在问题的情况下,我想我们无法修改原始blob. 显然,第二种方式(保留原件)是更加资源密集的方式. 解决方案的大局: >确定要查询的blob列表 这会导致比解决的问题更多的问题: >需要清理修改的blob 我想有一个不那么痛苦的解决方案 – 在外部方编写代码,使用查询结果并修改数据库的blob数据. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |