Oracle에서 CLOB 열의 크기를 바이트 단위로 가져오는 방법
의 사이즈(바이트)를 취득하려면 어떻게 해야 합니다.CLOB
컬럼을 표시합니까?
LENGTH()
그리고.DBMS_LOB.getLength()
둘 다 에서 사용된 문자 수를 반환합니다.CLOB
사용 바이트 수를 알아야 합니다(멀티바이트 문자를 다루고 있습니다).
고민 끝에 이 해결책을 생각해 냈습니다.
LENGTHB(TO_CHAR(SUBSTR(<CLOB-Column>,1,4000)))
SUBSTR
첫 번째 4000자(최대 문자열 크기)만 반환합니다.
TO_CHAR
에서 개종하다.CLOB
로.VARCHAR2
LENGTHB
문자열에서 사용되는 바이트 수를 반환합니다.
답변으로 코멘트를 덧붙이는 것은, 기존의 문제가 받아들여진 답변보다 넓은 범위에서 해결되기 때문입니다.참고: 데이터의 최대 길이와 멀티바이트 문자의 대략적인 비율을 알고 있어야 합니다.
CLOB가 4000바이트를 초과하는 경우 DBMS_LOB를 사용해야 합니다.기판이 아닌 기판.DBMS_LOB에서는 양 파라미터와 오프셋 파라미터가 반대로 설정되어 있는 것에 주의해 주십시오.기판
다음으로 4000자 미만의 값을 지정해야 할 수 있습니다.이 파라미터는 문자수이기 때문에 멀티바이트 문자가 있는 경우 4000자 이상의 문자를 사용할 수 있습니다.ORA-06502: PL/SQL: numeric or value error: character string buffer too small
이는 서브스트링 결과가 4000바이트 제한을 가진 VARCHAR2에 적합해야 하기 때문입니다.검색할 수 있는 문자 수는 데이터의 문자당 평균 바이트 수에 따라 달라집니다.
제 대답은 다음과 같습니다.
LENGTHB(TO_CHAR(DBMS_LOB.SUBSTR(<CLOB-Column>,3000,1)))
+NVL(LENGTHB(TO_CHAR(DBMS_LOB.SUBSTR(<CLOB-Column>,3000,3001))),0)
+NVL(LENGTHB(TO_CHAR(DBMS_LOB.SUBSTR(<CLOB-Column>,6000,6001))),0)
+...
여기서 가장 긴 CLOB를 커버하기 위해 필요한 만큼의 청크를 추가하고 데이터의 문자당 평균 바이트 수에 따라 청크 크기를 조정합니다.
VARCHAR2보다 큰 CLOB 사이즈의 경우는, 다음의 것을 시험해 주세요.
CLOB를 "VARCHAR2 compatible" 크기로 분할하고 CLOB 데이터의 모든 부분에 lengthb를 실행하여 모든 결과를 요약해야 합니다.
declare
my_sum int;
begin
for x in ( select COLUMN, ceil(DBMS_LOB.getlength(COLUMN) / 2000) steps from TABLE )
loop
my_sum := 0;
for y in 1 .. x.steps
loop
my_sum := my_sum + lengthb(dbms_lob.substr( x.COLUMN, 2000, (y-1)*2000+1 ));
-- some additional output
dbms_output.put_line('step:' || y );
dbms_output.put_line('char length:' || DBMS_LOB.getlength(dbms_lob.substr( x.COLUMN, 2000 , (y-1)*2000+1 )));
dbms_output.put_line('byte length:' || lengthb(dbms_lob.substr( x.COLUMN, 2000, (y-1)*2000+1 )));
continue;
end loop;
dbms_output.put_line('char summary:' || DBMS_LOB.getlength(x.COLUMN));
dbms_output.put_line('byte summary:' || my_sum);
continue;
end loop;
end;
/
간단한 해결책은 CLOB를 BLOB에 캐스팅하고 BLOB의 길이를 요청하는 것입니다!
문제는 Oracle에는 CLOB를 BLOB에 캐스트하는 함수가 없지만, 이를 위한 함수를 정의하기만 하면 된다는 것입니다.
create or replace
FUNCTION clob2blob (p_in clob) RETURN blob IS
v_blob blob;
v_desc_offset PLS_INTEGER := 1;
v_src_offset PLS_INTEGER := 1;
v_lang PLS_INTEGER := 0;
v_warning PLS_INTEGER := 0;
BEGIN
dbms_lob.createtemporary(v_blob,TRUE);
dbms_lob.converttoblob
( v_blob
, p_in
, dbms_lob.getlength(p_in)
, v_desc_offset
, v_src_offset
, dbms_lob.default_csid
, v_lang
, v_warning
);
RETURN v_blob;
END;
바이트 수를 얻기 위해 사용하는 SQL 명령어는 다음과 같습니다.
SELECT length(clob2blob(fieldname)) as nr_bytes
또는
SELECT dbms_lob.getlength(clob2blob(fieldname)) as nr_bytes
유니코드(UTF-8)를 사용하지 않고 Oracle 10g에서 테스트했습니다.단, 이 솔루션은 Unicode(UTF-8) Oracle 인스턴스:-를 사용하여 올바른 솔루션이어야 합니다.
clob을 blob으로 변환하는 솔루션을 게시한 Nashev에게 렌더링을 하고 싶습니다. Oracle에서 CLOB를 BLOB로 변환하는 방법은 무엇입니까?그리고 독일어로 작성된 이 게시물(코드는 PL/SQL에 있음) 13ter.info.2011에 blob을 clob으로 변환하는 기능이 추가되어 있습니다!
Unicode(UTF-8) CLOB에서 2개의 명령어를 테스트하여 Unicode에서 동작할 수 있도록 할 수 있습니까?
NVL(length(clob_col_name), 0)이 유효합니다.
테이블 이름을 사용하여 dba_lobs에서 LOB 세그먼트 이름을 확인합니다.
select TABLE_NAME,OWNER,COLUMN_NAME,SEGMENT_NAME from dba_lobs where TABLE_NAME='<<TABLE NAME>>';
이제 세그먼트 이름을 사용하여 dba_segments에서 사용되는 바이트를 찾습니다.
select s.segment_name, s.partition_name, bytes/1048576 "Size (MB)"
from dba_segments s, dba_lobs l
where s.segment_name = l.segment_name
and s.owner = '<< OWNER >> ' order by s.segment_name, s.partition_name;
4000바이트까지만 동작합니다.클롭이 4000바이트보다 크면 이 기능을 사용합니다.
declare
v_clob_size clob;
begin
v_clob_size:= (DBMS_LOB.getlength(v_clob)) / 1024 / 1024;
DBMS_OUTPUT.put_line('CLOB Size ' || v_clob_size);
end;
또는
select (DBMS_LOB.getlength(your_column_name))/1024/1024 from your_table
언급URL : https://stackoverflow.com/questions/1797183/how-to-get-size-in-bytes-of-a-clob-column-in-oracle
'programing' 카테고리의 다른 글
JSONObject가 null인지 존재하지 않는지 테스트하는 방법 (0) | 2023.03.28 |
---|---|
Node.js 아래에 JSON을 쉽게 저장하는 방법 (0) | 2023.03.28 |
Jeest에서 예기치 않은 토큰이 발견되었습니다. (0) | 2023.03.28 |
노드 사스는 개발입니까, 아니면 React 프로젝트에 의존합니까? (0) | 2023.03.28 |
현재 JSON 어레이(예: [1, 2, 3])를 유형으로 역직렬화할 수 없습니다. (0) | 2023.03.28 |