,

Размер Clob

среда, 1 апреля 2009 г. Оставить комментарий

Понадобилось определить размер clob в байтах. В базе установлена многобайтовая кодировка AL32UTF8. Функция length и dbms_lob.getlength возращают результат в символах, функция lengthb не применима для clob, если используется многобайтовая кодировка (функция возращает ошибку "ORA-22998: CLOB и NCLOB в многобайтовых кодовых таблицах не поддерживается").

Для определения размера пришлось сначала конвертировать clob в blob, а потом уже определить размер blob в байтах.


function clob_to_blob(p_clob in clob
) return blob
is
v_blob blob := null;


v_in pls_integer := 1;
v_out pls_integer := 1;

v_lang pls_integer := dbms_lob.default_lang_ctx;
v_warning pls_integer := dbms_lob.no_warning;
begin
if (p_clob is not null) then
dbms_lob.createtemporary(v_blob, true, dbms_lob.session);

dbms_lob.convertToBlob( dest_lob => v_blob
,src_clob => p_clob
,amount => dbms_lob.getlength(p_clob)
,dest_offset => v_in
,src_offset => v_out
,blob_csid => dbms_lob.default_csid
,lang_context => v_lang
,warning => v_warning
);
end if;
return v_blob;
end clob_to_blob;

function get_clob_size_in_bytes(p_clob in clob
) return number
is
v_blob blob;
v_result number := null;
begin
v_blob := clob_to_blob(p_clob => p_clob);
if (v_blob is not null) then
v_result := dbms_lob.getlength(v_blob);

if (dbms_lob.istemporary(lob_loc => v_blob) = 1) then
dbms_lob.freetemporary(v_blob);
end if;
end if;
return v_result;
end get_clob_size_in_bytes;

Подсказка взята отсюда How to find the size of clob cloumn when the character set is AL32UTF8??

UPD: Size of CLOB or BLOB in Oracle DB


0 коммент. »

Оставьте Ваш комментарий