Zunächst müssen Sie verstehen, was LOBs sind. Sie sind "große Daten", möglicherweise größer als alle anderen Datentypen in Oracle. Sie sind wie normale Dateien in einem Dateisystem. Um in eine Datei auf einem Dateisystem zu schreiben, müssen Sie
- Datei zum Schreiben öffnen
- Kürzen Sie die Datei, wenn Sie sie von Grund auf neu füllen möchten
- lesen Sie Ihre Quelldaten in Blöcken in einer Schleife
- Hängen Sie Ihre Datenblöcke nacheinander in derselben Schleife an die Datei an
- Datei schließen
Mehr oder weniger das Gleiche gilt für LOBs. In Ihrer Tabelle ist eine LOB-Spalte (CLOB/BLOB/NCLOB) nur ein Zeiger/Verweis auf einen anderen Ort auf Ihrem Plattenspeicher, der die eigentlichen Daten enthält. In Standard-Oracle-Begriffen heißt der Zeiger "LOB-Locator". Sie müssen
- öffne/initialisiere den LOB-Locator
- kürzen Sie den LOB-Inhalt, wenn Sie ihn von Grund auf neu füllen möchten
- Hängen Sie Ihre Datenblöcke in einer Schleife nacheinander an die LOB-Inhalte an
- Schließen Sie den LOB-Locator
In PL/SQL könnte das so aussehen:
-- 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;
Eine Erklärung:
- initialisieren Sie den LOB-Locator =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- öffne den LOB-Locator zum Schreiben =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- schneiden Sie den LOB-Inhalt ab, wenn Sie ihn von Grund auf neu füllen möchten ... Dies wird durch
empty_blob()
erledigt Rufen Sieinsert
auf . - Hängen Sie Ihre Datenblöcke in einer Schleife an den LOB-Inhalt an, einer nach dem anderen =hier nur eine Iteration von
dbms_lob.writeappend()
, wobei nur ein einzelner Chunkaaa
angehängt wird der Längeutl_raw.length(aaa)
(maximal 32767) in das LOBv_b
- Schließen Sie den LOB-Locator =
dbms_lob.close(LOB_LOC=>v_b);