Oracle
 sql >> Database >  >> RDS >> Oracle

Inserisci una stringa di test BLOB più grande di 2000 o 4000 byte

Per cominciare, devi capire cosa sono le LOB. Sono "dati di grandi dimensioni", probabilmente più grandi di qualsiasi altro tipo di dati in Oracle. Sono come file normali su un filesystem. Per scrivere su un file su un filesystem, dovrai

  1. apri il file per la scrittura
  2. tronca il file se desideri iniziare a riempirlo da zero
  3. Leggi i tuoi dati di origine in blocchi in un ciclo
  4. aggiungi i tuoi blocchi di dati al file nello stesso ciclo, uno per uno
  5. chiudi il file

Più o meno lo stesso vale per le LOB. Nella tabella, una colonna LOB (CLOB/BLOB/NCLOB) è solo un puntatore/riferimento a un altro punto della memoria su disco che contiene i dati effettivi. In termini Oracle standard, il puntatore è chiamato "LOB locator". Devi

  1. apri/inizializza il localizzatore LOB
  2. troncare il contenuto LOB, se si desidera iniziare a riempirlo da zero
  3. aggiungi i tuoi blocchi di dati ai contenuti LOB in un ciclo, uno per uno
  4. chiudi il localizzatore LOB

In PL/SQL potrebbe essere simile a questo:

-- 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;

Una spiegazione:

  1. inizializza il localizzatore LOB =insert into blob_test values(1,empty_blob()) returning b into v_b;
  2. apri il localizzatore LOB per la scrittura =dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  3. troncare il contenuto LOB, se si desidera iniziare a riempirlo da zero ... Questo viene fatto da empty_blob() chiama nel insert .
  4. aggiungi i tuoi blocchi di dati al contenuto LOB in un ciclo, uno per uno =qui solo un'iterazione di dbms_lob.writeappend() , aggiungendo un solo pezzo aaa di lunghezza utl_raw.length(aaa) (massimo 32767) nella LOB v_b
  5. chiudi il localizzatore LOB =dbms_lob.close(LOB_LOC=>v_b);