For det første skal du forstå, hvad LOB'er er. De er "store data", muligvis større end nogen andre datatyper i Oracle. De er som almindelige filer på et filsystem. For at skrive til en fil på et filsystem, skal du
- åbn filen til skrivning
- afkort filen, hvis du ønsker at begynde at udfylde den fra bunden
- læs dine kildedata i bidder i en løkke
- tilføj dine datastykker til filen i samme løkke, én efter én
- luk filen
Mere eller mindre det samme gælder for LOB'er. I din tabel er en LOB (CLOB/BLOB/NCLOB) kolonne blot en pegepind/reference til et andet sted på dit disklager, der indeholder de faktiske data. I standard Oracle-termer kaldes markøren "LOB locator". Du skal
- åbn/initialiser LOB-lokalisatoren
- trunker LOB-indholdet, hvis du ønsker at begynde at udfylde det fra bunden
- tilføj dine datastykker til LOB-indholdet i en loop, én efter én
- luk LOB-finderen
I PL/SQL kunne det se sådan ud:
-- 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;
En forklaring:
- initialiser LOB-lokalisatoren =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- åbn LOB-locatoren for at skrive =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- trunker LOB-indholdet, hvis du ønsker at begynde at udfylde det fra bunden ... Dette gøres af
empty_blob()
indkaldinsert
. - tilføj dine datastykker til LOB-indholdet i en loop, én efter én =her kun én iteration af
dbms_lob.writeappend()
, ved at tilføje kun en enkelt delaaa
af længdenutl_raw.length(aaa)
(maksimalt 32767) ind i LOBv_b
- luk LOB-lokalisatoren =
dbms_lob.close(LOB_LOC=>v_b);