sql >> Database >  >> RDS >> Oracle

Voeg BLOB-testreeks in die groter is dan 2000 of 4000 bytes

Om te beginnen moet u begrijpen wat LOB's zijn. Het zijn "grote gegevens", mogelijk groter dan alle andere gegevenstypen in Oracle. Ze zijn als gewone bestanden op een bestandssysteem. Om naar een bestand op een bestandssysteem te schrijven, moet je

  1. open het bestand om te schrijven
  2. kort het bestand af als je het helemaal opnieuw wilt vullen
  3. lees je brongegevens in stukjes in een lus
  4. voeg uw gegevensblokken één voor één toe aan het bestand in dezelfde lus
  5. sluit het bestand

Voor LOB's geldt min of meer hetzelfde. In uw tabel is een LOB-kolom (CLOB/BLOB/NCLOB) slechts een aanwijzer/verwijzing naar een andere plaats op uw schijfopslag die de feitelijke gegevens bevat. In standaard Oracle-termen wordt de aanwijzer "LOB-locator" genoemd. Je moet

  1. open/initialiseer de LOB-locator
  2. kort de LOB-inhoud af, als u deze helemaal opnieuw wilt vullen
  3. voeg uw gegevensblokken één voor één toe aan de LOB-inhoud in een lus
  4. sluit de LOB-locator

In PL/SQL zou het er zo uit kunnen zien:

-- 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;

Een uitleg:

  1. initialiseer de LOB-locator =insert into blob_test values(1,empty_blob()) returning b into v_b;
  2. open de LOB-locator om te schrijven =dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  3. kort de LOB-inhoud af, als u deze helemaal opnieuw wilt vullen ... Dit wordt gedaan door de empty_blob() roep de insert . in .
  4. voeg uw gegevensblokken toe aan de LOB-inhoud in een lus, één voor één =hier slechts één iteratie van dbms_lob.writeappend() , met slechts een enkel stuk aaa van lengte utl_raw.length(aaa) (maximaal 32767) in de LOB v_b
  5. sluit de LOB-locator =dbms_lob.close(LOB_LOC=>v_b);


  1. T-SQL:alle dubbele rijen verwijderen, maar er één behouden

  2. Extraheer het weeknummer van een datum in SQL Server (T-SQL)

  3. SQLRecoverableException:I/O-uitzondering:verbinding opnieuw instellen

  4. MySQL UNION 2-query's met ORDER BY's