Pro začátek musíte pochopit, co jsou LOB. Jsou to „velká data“, možná větší než jakékoli jiné datové typy v Oracle. Jsou jako běžné soubory v souborovém systému. Chcete-li zapisovat do souboru na souborovém systému, musíte
- otevřete soubor pro zápis
- zkraťte soubor, pokud jej chcete začít vyplňovat od začátku
- číst zdrojová data po částech ve smyčce
- připojte své části dat k souboru ve stejné smyčce, jeden po druhém
- zavřete soubor
Víceméně totéž platí pro LOBy. Ve vaší tabulce je sloupec LOB (CLOB/BLOB/NCLOB) pouze ukazatelem/odkazem na jiné místo na vašem diskovém úložišti, které obsahuje aktuální data. Ve standardních podmínkách Oracle se ukazatel nazývá "LOB locator". Musíte
- otevřete/inicializujete lokátor LOB
- zkraťte obsah LOB, pokud jej chcete začít vyplňovat od začátku
- připojujte své datové bloky k obsahu LOB ve smyčce, jeden po druhém
- zavřete lokátor LOB
V PL/SQL by to mohlo vypadat takto:
-- 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;
Vysvětlení:
- inicializovat lokátor LOB =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- otevřete lokátor LOB pro zápis =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- zkraťte obsah LOB, pokud jej chcete začít vyplňovat od začátku... To se provádí pomocí
empty_blob()
zavolejte doinsert
. - připojujte své datové bloky k obsahu LOB ve smyčce, jeden po druhém =zde pouze jedna iterace
dbms_lob.writeappend()
, připojí pouze jeden blokaaa
o délceutl_raw.length(aaa)
(maximálně 32767) do LOBv_b
- zavřete lokátor LOB =
dbms_lob.close(LOB_LOC=>v_b);