2017-05-03 8 views
5

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 데이터를 반환 할 수 있습니까?

+1

오라클 DB 이외의 솔루션을 찾아야 할 것 같습니다. 알다시피, RAW는 SQL의 경우 최대 길이가 4000 (SQL 문맥의 경우) 또는 PLSQL 컨텍스트의 경우 32767로 제한되므로 BLOB을 BLOB에서 호출 응용 프로그램으로 보내는 데 BLOB를 사용해야합니다. 클라이언트 측 변수를 원시 (32767)로 다시 선언하더라도 결국 길이가 32k를 넘는 JPEG 문제가 발생합니다. – nop77svk

+0

info @ nop77svk 주셔서 감사합니다. 방정식에서 RAW로 갈 필요가 있다면 ... 내 전체 BLOB에서 처음 12 바이트를 뺀 값을 반환하는 방법이 있습니까? – whitegoose

+0

예, 있습니다. 'dbms_lob.substr()'이 올바른 방법입니다. – nop77svk

답변

0

일반적으로 ORA-14553을 고려하여 쿼리에서 blob을 수정하는 것은 불가능합니다. Blob 변수는 데이터에 대한 포인터지만 데이터 자체에 대한 포인터는 아닙니다. 데이터 이후 (변수) 마지막 유형 의 RAM에서 직접 확인할 수 있습니다 - DBMS_LOB.SUBSTR 반환하지 BLOB 또는 CLOB하지만 RAW 또는 CHAR 같은 기능을하는 이유 때문이다.

따라서 수정 된 BLOB (머리에서 12 바이트를 잘라낸)를 쿼리하려면 쿼리하기 전에 수정 된 BLOB를 만들고 저장해야합니다. 비즈니스 요구 사항에 따라 원래 위치를 유지하거나 새로운 모양을 만들어 원본을 보존 할 수 있습니다. 질문의 경우에는 원래의 얼룩을 수정할 수 없다고 가정합니다.

분명히 두 번째 방법 (원본 보존)은 리소스 집약적 인 방식입니다. 솔루션의

큰 그림 :

  1. 당신이 목록의 각 항목에 대해
  2. 를 조회하려고하는 모양의 목록을 결정하고, 작성 및 저장 수정 BLOB (예를 들어,원래
  3. 실행 쿼리 반환 수정 모양에 id로 링크) 12 바이트를 손질과
  4. 제거 수정 모양은 (즉시 aftery 쿼리 커서는 해결보다

이 더 많은 문제가 발생) 소비 또는 일정입니다 : 수정 모양의 정리에 대한

  • 필요가
  • 원래의 동기화는 오전 배로
  • 수정 저장된 데이터
  • 또 다른 놀라움

내가 덜 고통스러운 해결책이 추측의 ount는 - 쿼리 결과를 소모 외부 자에 코드를 작성하고 데이터베이스의 ouside BLOB 데이터를 수정합니다.