Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Inserir string de teste BLOB maior que 2000 ou 4000 bytes


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
  1. abra o arquivo para escrita
  2. trunque o arquivo se quiser começar a preenchê-lo do zero
  3. leia seus dados de origem em partes em um loop
  4. anexe seus blocos de dados ao arquivo no mesmo loop, um por um
  5. 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
  1. abra/inicialize o localizador de LOB
  2. trunque o conteúdo do LOB, se desejar começar a preenchê-lo do zero
  3. anexe seus blocos de dados ao conteúdo do LOB em um loop, um por um
  4. 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:
  1. inicializar o localizador LOB =insert into blob_test values(1,empty_blob()) returning b into v_b;
  2. abra o localizador LOB para escrita =dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  3. trunque o conteúdo do LOB, caso queira começar a preenchê-lo do zero... Isso é feito pelo empty_blob() chame no insert .
  4. 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ço aaa de comprimento utl_raw.length(aaa) (máximo de 32767) no LOB v_b
  5. feche o localizador LOB =dbms_lob.close(LOB_LOC=>v_b);