Om te beginnen moet u begrijpen wat LOB's zijn. Het zijn "grote gegevens", mogelijk groter dan alle andere gegevenstypen in Oracle. Ze zijn als gewone bestanden op een bestandssysteem. Om naar een bestand op een bestandssysteem te schrijven, moet je
- open het bestand om te schrijven
- kort het bestand af als je het helemaal opnieuw wilt vullen
- lees je brongegevens in stukjes in een lus
- voeg uw gegevensblokken één voor één toe aan het bestand in dezelfde lus
- sluit het bestand
Voor LOB's geldt min of meer hetzelfde. In uw tabel is een LOB-kolom (CLOB/BLOB/NCLOB) slechts een aanwijzer/verwijzing naar een andere plaats op uw schijfopslag die de feitelijke gegevens bevat. In standaard Oracle-termen wordt de aanwijzer "LOB-locator" genoemd. Je moet
- open/initialiseer de LOB-locator
- kort de LOB-inhoud af, als u deze helemaal opnieuw wilt vullen
- voeg uw gegevensblokken één voor één toe aan de LOB-inhoud in een lus
- sluit de LOB-locator
In PL/SQL zou het er zo uit kunnen zien:
-- 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;
Een uitleg:
- initialiseer de LOB-locator =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- open de LOB-locator om te schrijven =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- kort de LOB-inhoud af, als u deze helemaal opnieuw wilt vullen ... Dit wordt gedaan door de
empty_blob()
roep deinsert
. in . - voeg uw gegevensblokken toe aan de LOB-inhoud in een lus, één voor één =hier slechts één iteratie van
dbms_lob.writeappend()
, met slechts een enkel stukaaa
van lengteutl_raw.length(aaa)
(maximaal 32767) in de LOBv_b
- sluit de LOB-locator =
dbms_lob.close(LOB_LOC=>v_b);