복붙노트

[SQL] 나는 오라클 SQL에서 BLOB에서 텍스트 내용을 얻는 방법

SQL

나는 오라클 SQL에서 BLOB에서 텍스트 내용을 얻는 방법

나는 오라클 BLOB 안에 무엇 SQL 콘솔에서 볼하려합니다.

나는 그것이 텍스트의 다소 큰 몸을 포함 알고 난 그냥 텍스트를 확인해야하지만 다음 쿼리는 해당 필드에 BLOB가 있음을 나타냅니다 :

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

내가지고있어 결과는 내가 기대했던 꽤되지 않습니다 :

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

그래서 어떤 종류의 마법 주술의 나는 텍스트 표현의에 BLOB을 설정하기 위해 무엇을 할 수 있는가?

PS : 나는 그냥 SQL 콘솔 (이클립스 데이터 도구)에서 BLOB의 내용을보고 노력하고, 코드에서 사용할 수 없습니다.

해결법

  1. ==============================

    1.우선, 대신 (쿼리 길함으로써, CLOB와 함께 일하는 것이) 바이너리 데이터에 대한 설계 BLOB의 CLOB / NCLOB 컬럼에 저장 텍스트를 할 수 있습니다.

    우선, 대신 (쿼리 길함으로써, CLOB와 함께 일하는 것이) 바이너리 데이터에 대한 설계 BLOB의 CLOB / NCLOB 컬럼에 저장 텍스트를 할 수 있습니다.

    다음 쿼리는 당신이 제공하는 모든 문자 집합이 호환, 블롭 안의 텍스트의 (대부분에서) 첫 32767 개 문자를 볼 수있게된다합니다 (BLOB에 저장된 텍스트의 원래 CS, VARCHAR2에 사용되는 데이터베이스의 CS) :

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

    2.당신은 테이블에서 BLOB 필드를 읽을 SQL 이하로 사용할 수 있습니다.

    당신은 테이블에서 BLOB 필드를 읽을 SQL 이하로 사용할 수 있습니다.

    SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;
    
  3. ==============================

    3.SQL 개발자도이 기능을 제공합니다 :

    SQL 개발자도이 기능을 제공합니다 :

    더블 결과 그리드 셀을 클릭하고 편집을 클릭합니다 :

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

    그리고 그게 다야!

  4. ==============================

    4.당신이 오히려보기보다는, 텍스트 내에서 검색 할 경우,이 작품 :

    당신이 오히려보기보다는, 텍스트 내에서 검색 할 경우,이 작품 :

    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;
    
  5. ==============================

    5.나는 잠시 동안 고투하고, PL / SQL 솔루션을 구현, 나중에 두꺼비에 당신이 할 수있는 결과 그리드 셀을 더블 클릭하고 텍스트의 내용으로 편집기를 나타납니다 것을 깨달았다. (난 두꺼비 V11에있어)

    나는 잠시 동안 고투하고, PL / SQL 솔루션을 구현, 나중에 두꺼비에 당신이 할 수있는 결과 그리드 셀을 더블 클릭하고 텍스트의 내용으로 편집기를 나타납니다 것을 깨달았다. (난 두꺼비 V11에있어)

  6. ==============================

    6.내 열이 압축되지 않기 때문에 곳간의 대답은 수정과 날 위해 일했습니다. 빠른 더러운 솔루션 :

    내 열이 압축되지 않기 때문에 곳간의 대답은 수정과 날 위해 일했습니다. 빠른 더러운 솔루션 :

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

    7.이 시도 할 수 있습니다 :

    이 시도 할 수 있습니다 :

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

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

  8. ==============================

    8.경우 텍스트가 DEFLATE 알고리즘을 사용하여 BLOB 내부에 압축되고 꽤 큰, 당신은 그것을 읽을이 기능을 사용할 수 있습니다

    경우 텍스트가 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;
    

    이 의지 도움말 사람을 바랍니다.

  9. ==============================

    9.BLOB에의 첫 번째 2000 개 문자를 얻기 위해이 SQL을 사용합니다.

    BLOB에의 첫 번째 2000 개 문자를 얻기 위해이 SQL을 사용합니다.

    SELECT utl_raw.cast_to_varchar2(dbms_lob.substr(<YOUR_BLOB_FIELD>,2000,1)) FROM <YOUR_TABLE>;
    

    참고 : 오라클의 길이가 2000보다 더 BLOB의 변환을 처리 할 수 ​​없습니다 때문입니다.

  10. ==============================

    10.나를 위해 일했다,

    나를 위해 일했다,

  11. ==============================

    11.사용 TO_CHAR 함수입니다.

    사용 TO_CHAR 함수입니다.

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

    변환 NCHAR, 데이터베이스 문자 집합에 NVARCHAR2, CLOB 또는 NCLOB 데이터. 반환 값은 항상 VARCHAR2이다.

  12. from https://stackoverflow.com/questions/828650/how-do-i-get-textual-contents-from-blob-in-oracle-sql by cc-by-sa and MIT license