Като за начало трябва да разберете какво представляват LOB. Те са „големи данни“, вероятно по-големи от всички други типове данни в Oracle. Те са като обикновени файлове във файлова система. За да пишете във файл във файлова система, ще трябва да
- отворете файла за запис
- съкратете файла, ако искате да започнете да го попълвате от нулата
- прочетете изходните си данни на части в цикъл
- добавете вашите части от данни към файла в същия цикъл, един по един
- затворете файла
Горе-долу същото важи и за LOB. Във вашата таблица колона LOB (CLOB/BLOB/NCLOB) е просто указател/препратка към друго място на вашето дисково хранилище, съдържащо действителните данни. В стандартните термини на Oracle указателят се нарича "LOB локатор". Трябва да
- отворете/инициализирайте LOB локатора
- съкратете LOB съдържанието, ако искате да започнете да го попълвате от нулата
- добавете вашите части от данни към съдържанието на LOB в цикъл, един по един
- затваряне на LOB локатора
В PL/SQL може да изглежда така:
-- 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;
Обяснение:
- инициализиране на LOB локатора =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- отворете LOB локатора за запис =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- съкратете LOB съдържанието, ако искате да започнете да го попълвате от нулата ... Това се прави от
empty_blob()
извикване вinsert
. - добавете вашите части от данни към съдържанието на LOB в цикъл, един по един =тук само една итерация на
dbms_lob.writeappend()
, добавяйки само едно парчеaaa
с дължинаutl_raw.length(aaa)
(максимум 32767) в LOBv_b
- затваряне на LOB локатора =
dbms_lob.close(LOB_LOC=>v_b);