Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fügen Sie eine BLOB-Testzeichenfolge ein, die größer als 2000 oder 4000 Byte ist

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

  1. Datei zum Schreiben öffnen
  2. Kürzen Sie die Datei, wenn Sie sie von Grund auf neu füllen möchten
  3. lesen Sie Ihre Quelldaten in Blöcken in einer Schleife
  4. Hängen Sie Ihre Datenblöcke nacheinander in derselben Schleife an die Datei an
  5. 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

  1. öffne/initialisiere den LOB-Locator
  2. kürzen Sie den LOB-Inhalt, wenn Sie ihn von Grund auf neu füllen möchten
  3. Hängen Sie Ihre Datenblöcke in einer Schleife nacheinander an die LOB-Inhalte an
  4. 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:

  1. initialisieren Sie den LOB-Locator =insert into blob_test values(1,empty_blob()) returning b into v_b;
  2. öffne den LOB-Locator zum Schreiben =dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  3. schneiden Sie den LOB-Inhalt ab, wenn Sie ihn von Grund auf neu füllen möchten ... Dies wird durch empty_blob() erledigt Rufen Sie insert auf .
  4. 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 Chunk aaa angehängt wird der Länge utl_raw.length(aaa) (maximal 32767) in das LOB v_b
  5. Schließen Sie den LOB-Locator =dbms_lob.close(LOB_LOC=>v_b);