Oracle SQL에서 Blob에서 텍스트 내용을 얻으려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/828650

  •  06-07-2019
  •  | 
  •  

문제

SQL 콘솔에서 Oracle Blob 내부에 무엇이 있는지 보려고합니다.

나는 그것이 다소 큰 텍스트를 포함하고 있다는 것을 알고 있으며 텍스트를보고 싶지만 다음 쿼리는 해당 필드에 블로브가 있음을 나타냅니다.

select BLOB_FIELD from TABLE_WITH_BLOB where ID = '<row id>';

내가 얻는 결과는 내가 기대 한 것이 아닙니다.

    BLOB_FIELD
    -----------------------
    oracle.sql.BLOB@1c4ada9

그렇다면 블로브를 텍스트 표현으로 바꾸려면 어떤 종류의 마술을 할 수 있습니까?

추신 : SQL 콘솔 (Eclipse Data Tools)에서 블로브 내용을 보려고 노력하고 있습니다.

도움이 되었습니까?

해결책

우선, 이진 데이터 용으로 설계된 블로브 대신 클로브/nclob 열에 텍스트를 저장할 수 있습니다 (쿼리는 클로브에서 작동합니다).

다음 쿼리를 통해 모든 문자 세트가 호환되는 경우 (Blob에 저장된 텍스트의 원본 CS, Varchar2에 사용 된 데이터베이스의 CS).

select utl_raw.cast_to_varchar2(dbms_lob.substr(BLOB_FIELD)) from TABLE_WITH_BLOB where ID = '<row id>';

다른 팁

아래 SQL을 사용하여 테이블에서 Blob 필드를 읽을 수 있습니다.

SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;

텍스트를 보지 않고 검색하려면 다음과 같습니다.

with unzipped_text as (
  select
    my_id
    ,utl_compress.lz_uncompress(my_compressed_blob) as my_blob
  from my_table
  where my_id='MY_ID'
)
select * from unzipped_text
where dbms_lob.instr(my_blob, utl_raw.cast_to_raw('MY_SEARCH_STRING'))>0;

SQL Developer는이 기능을 제공합니다.

결과 그리드 셀을 두 번 클릭하고 편집을 클릭하십시오.

enter image description here

그런 다음 팝업의 오른쪽 상단 부분에서 "텍스트로보기"(이미지를 볼 수도 있습니다 ..)

enter image description here

그리고 그게 다야!

enter image description here

나는 이것에 대해 잠시 동안 어려움을 겪고 PL/SQL 솔루션을 구현했지만 나중에 두꺼비에서는 결과 그리드 셀을 두 번 클릭 할 수 있으며 텍스트에 내용이있는 편집기를 불러 일으킨다는 것을 깨달았습니다. (I 'm on Toad V11)

enter image description here

헛간의 대답은 내 열이 압축되지 않기 때문에 수정으로 저에게 효과가있었습니다. 빠르고 더러운 솔루션 :

select * from my_table
where dbms_lob.instr(my_UNcompressed_blob, utl_raw.cast_to_raw('MY_SEARCH_STRING'))>0;

당신은 이것을 시도 할 수 있습니다 :

SELECT TO_CHAR(dbms_lob.substr(BLOB_FIELD, 3900)) FROM TABLE_WITH_BLOB;

그러나 4000 바이트로 제한됩니다

Deflate 알고리즘을 사용하여 텍스트가 Blob 내부에서 압축되어 상당히 큰 경우이 기능을 사용하여 읽을 수 있습니다.

CREATE OR REPLACE PACKAGE read_gzipped_entity_package AS

FUNCTION read_entity(entity_id IN VARCHAR2)
  RETURN VARCHAR2;

END read_gzipped_entity_package;
/

CREATE OR REPLACE PACKAGE BODY read_gzipped_entity_package IS

FUNCTION read_entity(entity_id IN VARCHAR2) RETURN VARCHAR2
IS
    l_blob              BLOB;
    l_blob_length       NUMBER;
    l_amount            BINARY_INTEGER := 10000; -- must be <= ~32765.
    l_offset            INTEGER := 1;
    l_buffer            RAW(20000);
    l_text_buffer       VARCHAR2(32767);
BEGIN
    -- Get uncompressed BLOB
    SELECT UTL_COMPRESS.LZ_UNCOMPRESS(COMPRESSED_BLOB_COLUMN_NAME)
    INTO   l_blob
    FROM   TABLE_NAME
    WHERE  ID = entity_id;

    -- Figure out how long the BLOB is.
    l_blob_length := DBMS_LOB.GETLENGTH(l_blob);

    -- We'll loop through the BLOB as many times as necessary to
    -- get all its data.
    FOR i IN 1..CEIL(l_blob_length/l_amount) LOOP

        -- Read in the given chunk of the BLOB.
        DBMS_LOB.READ(l_blob
        ,             l_amount
        ,             l_offset
        ,             l_buffer);

        -- The DBMS_LOB.READ procedure dictates that its output be RAW.
        -- This next procedure converts that RAW data to character data.
        l_text_buffer := UTL_RAW.CAST_TO_VARCHAR2(l_buffer);

        -- For the next iteration through the BLOB, bump up your offset
        -- location (i.e., where you start reading from).
        l_offset := l_offset + l_amount;
    END LOOP;
    RETURN l_text_buffer;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('!ERROR: ' || SUBSTR(SQLERRM,1,247));
END;

END read_gzipped_entity_package;
/

그런 다음 선택을 실행하여 텍스트를 얻습니다

SELECT read_gzipped_entity_package.read_entity('entity_id') FROM DUAL;

이것이 누군가를 도울 수 있기를 바랍니다.

나를 위해 일했고

lcase (삽입 (삽입 (삽입 (insert (hex (blob_field), 9,0, '-'), 14,0, '-'), 19,0, '-'), 24,0, '- ')))) a as Field_id에서 table_with_blob에서 id ='row id ';

사용 TO_CHAR 기능.

select TO_CHAR(BLOB_FIELD) from TABLE_WITH_BLOB where ID = '<row id>'

변환 NCHAR, NVARCHAR2, CLOB, 또는 NCLOB 데이터베이스 문자 세트에 대한 데이터. 반환 된 가치는 항상입니다 VARCHAR2.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top