Till att börja med måste du förstå vad LOB är. De är "stora data", möjligen större än någon annan datatyp i Oracle. De är som vanliga filer i ett filsystem. För att kunna skriva till en fil på ett filsystem måste du
- öppna filen för skrivning
- Trunkera filen om du vill börja fylla den från början
- läs dina källdata i bitar i en slinga
- lägg till dina databitar i filen i samma loop, en efter en
- stäng filen
Mer eller mindre samma sak gäller för LOB. I din tabell är en LOB (CLOB/BLOB/NCLOB) kolumn bara en pekare/referens till en annan plats på din disklagring som innehåller de faktiska data. I vanliga Oracle-termer kallas pekaren "LOB locator". Du måste
- öppna/initiera LOB-sökaren
- Trunkera LOB-innehållet om du vill börja fylla det från början
- lägg till dina databitar till LOB-innehållet i en loop, en efter en
- stäng LOB-sökaren
I PL/SQL kan det se ut så här:
-- 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 förklaring:
- initiera LOB-locatorn =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- öppna LOB-sökaren för att skriva =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- Trunkera LOB-innehållet, om du vill börja fylla det från början ... Detta görs av
empty_blob()
anropainsert
. - lägg till dina databitar till LOB-innehållet i en loop, en efter en =här endast en iteration av
dbms_lob.writeappend()
, bara lägga till en enstaka bitaaa
av längdenutl_raw.length(aaa)
(maximalt 32767) till LOBv_b
- stäng LOB-sökaren =
dbms_lob.close(LOB_LOC=>v_b);