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
- apri il file per la scrittura
- tronca il file se desideri iniziare a riempirlo da zero
- Leggi i tuoi dati di origine in blocchi in un ciclo
- aggiungi i tuoi blocchi di dati al file nello stesso ciclo, uno per uno
- 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
- apri/inizializza il localizzatore LOB
- troncare il contenuto LOB, se si desidera iniziare a riempirlo da zero
- aggiungi i tuoi blocchi di dati ai contenuti LOB in un ciclo, uno per uno
- 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:
- inizializza il localizzatore LOB =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- apri il localizzatore LOB per la scrittura =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- troncare il contenuto LOB, se si desidera iniziare a riempirlo da zero ... Questo viene fatto da
empty_blob()
chiama nelinsert
. - 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 pezzoaaa
di lunghezzautl_raw.length(aaa)
(massimo 32767) nella LOBv_b
- chiudi il localizzatore LOB =
dbms_lob.close(LOB_LOC=>v_b);