Para começar, você precisa entender o que são LOBs. Eles são "grandes dados", possivelmente maiores do que quaisquer outros tipos de dados no Oracle. Eles são como arquivos regulares em um sistema de arquivos. Para gravar em um arquivo em um sistema de arquivos, você terá que
- abra o arquivo para escrita
- trunque o arquivo se quiser começar a preenchê-lo do zero
- leia seus dados de origem em partes em um loop
- anexe seus blocos de dados ao arquivo no mesmo loop, um por um
- fechar o arquivo
Mais ou menos o mesmo é verdadeiro para LOBs. Em sua tabela, uma coluna LOB (CLOB/BLOB/NCLOB) é apenas um ponteiro/referência para outro local em seu armazenamento em disco que contém os dados reais. Nos termos padrão do Oracle, o ponteiro é chamado de "localizador de LOB". Você precisa
- abra/inicialize o localizador de LOB
- trunque o conteúdo do LOB, se desejar começar a preenchê-lo do zero
- anexe seus blocos de dados ao conteúdo do LOB em um loop, um por um
- feche o localizador de LOB
Em PL/SQL poderia ficar assim:
-- create table blob_test(id number, b blob);
declare
v_b blob;
aaa raw(32767);
longLine varchar2(32767);
begin
longLine := LPAD('aaaa', 32767,'x');
aaa := UTL_RAW.CAST_TO_RAW(longLine);
insert into blob_test values(1,empty_blob()) returning b into v_b;
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
dbms_lob.writeappend(v_b,UTL_RAW.LENGTH (aaa) ,aaa);
dbms_lob.close(LOB_LOC=>v_b);
commit;
end;
Uma explicação:
- inicializar o localizador LOB =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- abra o localizador LOB para escrita =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- trunque o conteúdo do LOB, caso queira começar a preenchê-lo do zero... Isso é feito pelo
empty_blob()
chame noinsert
. - anexe seus pedaços de dados ao conteúdo do LOB em um loop, um por um =aqui apenas uma iteração de
dbms_lob.writeappend()
, anexando apenas um único pedaçoaaa
de comprimentoutl_raw.length(aaa)
(máximo de 32767) no LOBv_b
- feche o localizador LOB =
dbms_lob.close(LOB_LOC=>v_b);