[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.우선, 대신 (쿼리 길함으로써, 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.당신은 테이블에서 BLOB 필드를 읽을 SQL 이하로 사용할 수 있습니다.
당신은 테이블에서 BLOB 필드를 읽을 SQL 이하로 사용할 수 있습니다.
SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;
-
==============================
3.SQL 개발자도이 기능을 제공합니다 :
SQL 개발자도이 기능을 제공합니다 :
더블 결과 그리드 셀을 클릭하고 편집을 클릭합니다 :
그 다음의 오른쪽 상단 부분에 팝업, "보기로 텍스트"(당신은 이미지를 볼 수 있습니다 ..)
그리고 그게 다야!
-
==============================
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.나는 잠시 동안 고투하고, PL / SQL 솔루션을 구현, 나중에 두꺼비에 당신이 할 수있는 결과 그리드 셀을 더블 클릭하고 텍스트의 내용으로 편집기를 나타납니다 것을 깨달았다. (난 두꺼비 V11에있어)
나는 잠시 동안 고투하고, PL / SQL 솔루션을 구현, 나중에 두꺼비에 당신이 할 수있는 결과 그리드 셀을 더블 클릭하고 텍스트의 내용으로 편집기를 나타납니다 것을 깨달았다. (난 두꺼비 V11에있어)
-
==============================
6.내 열이 압축되지 않기 때문에 곳간의 대답은 수정과 날 위해 일했습니다. 빠른 더러운 솔루션 :
내 열이 압축되지 않기 때문에 곳간의 대답은 수정과 날 위해 일했습니다. 빠른 더러운 솔루션 :
select * from my_table where dbms_lob.instr(my_UNcompressed_blob, utl_raw.cast_to_raw('MY_SEARCH_STRING'))>0;
-
==============================
7.이 시도 할 수 있습니다 :
이 시도 할 수 있습니다 :
SELECT TO_CHAR(dbms_lob.substr(BLOB_FIELD, 3900)) FROM TABLE_WITH_BLOB;
그러나, 그것은 4000 바이트로 제한됩니다
-
==============================
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.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.나를 위해 일했다,
나를 위해 일했다,
-
==============================
11.사용 TO_CHAR 함수입니다.
사용 TO_CHAR 함수입니다.
select TO_CHAR(BLOB_FIELD) from TABLE_WITH_BLOB where ID = '<row id>'
변환 NCHAR, 데이터베이스 문자 집합에 NVARCHAR2, CLOB 또는 NCLOB 데이터. 반환 값은 항상 VARCHAR2이다.
from https://stackoverflow.com/questions/828650/how-do-i-get-textual-contents-from-blob-in-oracle-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server의 문자열에서 모든 공백을 제거 (0) | 2020.04.23 |
---|---|
[SQL] 어떻게 MySQL의에서 선택에서 삭제? (0) | 2020.04.23 |
[SQL] MySQL의에서이 연산자는 <=> 무엇입니까? (0) | 2020.04.23 |
[SQL] 안드로이드 SQLite는 : UPDATE 문 (0) | 2020.04.23 |
[SQL] 어떻게 Oracle 데이터베이스에 허용되는 최대 연결 수를 확인하려면? (0) | 2020.04.23 |