Oracle 11 데이터베이스에 저장된 일부 jpg를 검색해야하는보고 도구 (Pentaho Report Designer)에 대한 쿼리를 작성하고 있습니다. 트릭은 조그 (BLOB로 저장 됨)에 제거해야하는 12 바이트 헤더 (다른 애플리케이션에 의해 추가 된)가 포함된다는 것입니다. 또한보고 도구는 데이터를 RAW 데이터로 반환해야합니다.Oracle SQL - BLOB에서 선행 바이트를 제거하는 방법 (그리고 RAW로 반환)?
BLOB를 조작하기 위해 찾은 함수/프로 시저의 크기/길이 제한이 너무 커서 문제가 발생합니다. 스트립 이미지의 경우
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 바이트,이 완벽하게 작동합니다 :
이 쿼리는 내가 DBMS_LOB.SUBSTR (dbfile.filedata, 2000,12)를 사용하여, 그것을 얻을 수있는 작업에 가깝게 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 데이터를 반환 할 수 있습니까?
오라클 DB 이외의 솔루션을 찾아야 할 것 같습니다. 알다시피, RAW는 SQL의 경우 최대 길이가 4000 (SQL 문맥의 경우) 또는 PLSQL 컨텍스트의 경우 32767로 제한되므로 BLOB을 BLOB에서 호출 응용 프로그램으로 보내는 데 BLOB를 사용해야합니다. 클라이언트 측 변수를 원시 (32767)로 다시 선언하더라도 결국 길이가 32k를 넘는 JPEG 문제가 발생합니다. – nop77svk
info @ nop77svk 주셔서 감사합니다. 방정식에서 RAW로 갈 필요가 있다면 ... 내 전체 BLOB에서 처음 12 바이트를 뺀 값을 반환하는 방법이 있습니까? – whitegoose
예, 있습니다. 'dbms_lob.substr()'이 올바른 방법입니다. – nop77svk