Na początek musisz zrozumieć, czym są LOB. Są to „duże dane”, prawdopodobnie większe niż jakiekolwiek inne typy danych w Oracle. Są jak zwykłe pliki w systemie plików. Aby pisać do pliku w systemie plików, musisz
- otwórz plik do zapisu
- Obetnij plik, jeśli chcesz zacząć wypełniać go od zera
- odczytaj swoje dane źródłowe porcjami w pętli
- dołącz swoje fragmenty danych do pliku w tej samej pętli, jeden po drugim
- zamknij plik
Mniej więcej to samo dotyczy obiektów LOB. W Twojej tabeli kolumna LOB (CLOB/BLOB/NCLOB) jest tylko wskaźnikiem/odniesieniem do innego miejsca na dysku, w którym znajdują się rzeczywiste dane. W standardowych terminach Oracle wskaźnik nazywa się „lokalizatorem LOB”. Musisz
- otwórz/zainicjuj lokalizator LOB
- skróć zawartość LOB, jeśli chcesz zacząć wypełniać ją od zera
- dołącz swoje fragmenty danych do zawartości LOB w pętli, jeden po drugim
- zamknij lokalizator LOB
W PL/SQL może to wyglądać tak:
-- 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;
Wyjaśnienie:
- zainicjuj lokalizator LOB =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- otwórz lokalizator LOB do zapisu =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- Obetnij zawartość LOB, jeśli chcesz zacząć wypełniać ją od zera... Jest to wykonywane przez
empty_blob()
wywołanie winsert
. - dołącz swoje fragmenty danych do zawartości LOB w pętli, jeden po drugim =tutaj tylko jedna iteracja
dbms_lob.writeappend()
, dołączając tylko jeden fragmentaaa
długościutl_raw.length(aaa)
(maksymalnie 32767) do LOBv_b
- zamknij lokalizator LOB =
dbms_lob.close(LOB_LOC=>v_b);