programing

Oracle SQL의 BLOB에서 텍스트 콘텐츠를 가져오려면 어떻게 해야 합니까?

mailnote 2023. 3. 27. 21:24
반응형

Oracle SQL의 BLOB에서 텍스트 콘텐츠를 가져오려면 어떻게 해야 합니까?

SQL 콘솔에서 Oracle BLOB 안에 무엇이 있는지 확인하려고 합니다.

텍스트 본문이 다소 크다는 것을 알고 텍스트만 보고 싶지만 다음 쿼리는 해당 필드에 BLOB가 있음을 나타냅니다.

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

결과가 내가 기대했던 것과 같지 않다.

BLOB_들판-----------------------oracle.sql을 클릭합니다.BLOB@1c4ada9

그러면 BLOB를 텍스트로 표현하기 위해 어떤 마법을 쓸 수 있을까요?

추신: SQL 콘솔(Eclipse Data Tools)에서 BLOB의 내용을 보려고 했을 뿐이지 코드로 사용하는 것은 아닙니다.

먼저 이진 데이터용으로 설계된 BLOB 대신 CLOB/NCLOB 열에 텍스트를 저장할 수 있습니다(쿼리는 CLOB와 함께 작동합니다).

다음 쿼리에서는 모든 문자 세트(VARCHAR2에 사용되는 데이터베이스의 BLOB, CS에 저장되어 있는 텍스트의 원래 CS)가 호환성이 있는 경우 BLOB 내의 텍스트의 첫 번째 32767 문자(최대)를 표시할 수 있습니다.

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

SQL Developer는 다음 기능도 제공합니다.

결과 그리드 셀을 두 번 클릭하고 편집을 클릭합니다.

여기에 이미지 설명 입력

팝업 오른쪽 상단에는 "텍스트로 표시" (이미지도 볼 수 있습니다)

여기에 이미지 설명 입력

바로 그거야!

여기에 이미지 설명 입력

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

SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;

이 SQL을 사용하여 BLOB의 처음 2000자를 가져옵니다.

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

주의: 이는 Oracle이 길이 2000을 초과하는 BLOB 변환을 처리할 수 없기 때문입니다.

텍스트가 아닌 텍스트 내에서 검색하려면 다음과 같이 하십시오.

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;

TO_CLOB(docs)를 사용하여 동작시킬 수 있습니다.

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

이는 Oracle 19c에서 VARCHAR 제한을 크게 하는 BLOB 필드에서 사용할 수 있습니다.읽을 수 있는 텍스트를 얻습니다(JSON 보유 BLOB에서).

내 칼럼이 압축되지 않았기 때문에 반의 답변은 수정과 함께 나에게 효과가 있었다.빠르고 더러운 솔루션:

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

잠시 동안 PL/SQL 솔루션을 구현했지만 나중에 Toad에서 결과 그리드 셀을 두 번 클릭하기만 하면 텍스트로 된 콘텐츠가 있는 편집기가 뜬다는 것을 알게 되었습니다.(Toad v11에 있음)

여기에 이미지 설명 입력

텍스트가 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를 실행하여 텍스트를 가져옵니다.

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

이게 누군가에게 도움이 되길 바랍니다.

다음과 같이 시험해 보십시오.

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

단, 4000바이트로 제한됩니다.

날 위해 일했지

lcase ( insert ( insert ( insert ( insert ( insert ( insert ( insert ( insert ( inx ( BLOB _ FILD ) ) ) , 14 , 0 , - ' , 19 , 0 , - ' ) , 24 , 0 , - ) ) 。TABLE_WITH_BLOB의 ID = '행 ID';

TO_CHAR★★★★★★ 。

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

「」를 합니다.NCHAR,NVARCHAR2,CLOB , 「」NCLOB데이터베이스 문자 집합으로 데이터를 전송합니다.은 항상 「」입니다.VARCHAR2.

언급URL : https://stackoverflow.com/questions/828650/how-do-i-get-textual-contents-from-blob-in-oracle-sql

반응형