programing

Oracle에서 CLOB 열의 크기를 바이트 단위로 가져오는 방법

skycolor 2023. 3. 28. 21:30
반응형

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(DBM‌​S_LOB.SUBSTR(<CLOB-Column>,3000,3001))),0)
+NVL(LENGTHB(TO_CHAR(DBM‌​S_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

반응형