sql >> Databáze >  >> RDS >> Oracle

Vložte testovací řetězec BLOB větší než 2000 nebo 4000 bajtů

Pro začátek musíte pochopit, co jsou LOB. Jsou to „velká data“, možná větší než jakékoli jiné datové typy v Oracle. Jsou jako běžné soubory v souborovém systému. Chcete-li zapisovat do souboru na souborovém systému, musíte

  1. otevřete soubor pro zápis
  2. zkraťte soubor, pokud jej chcete začít vyplňovat od začátku
  3. číst zdrojová data po částech ve smyčce
  4. připojte své části dat k souboru ve stejné smyčce, jeden po druhém
  5. zavřete soubor

Víceméně totéž platí pro LOBy. Ve vaší tabulce je sloupec LOB (CLOB/BLOB/NCLOB) pouze ukazatelem/odkazem na jiné místo na vašem diskovém úložišti, které obsahuje aktuální data. Ve standardních podmínkách Oracle se ukazatel nazývá "LOB locator". Musíte

  1. otevřete/inicializujete lokátor LOB
  2. zkraťte obsah LOB, pokud jej chcete začít vyplňovat od začátku
  3. připojujte své datové bloky k obsahu LOB ve smyčce, jeden po druhém
  4. zavřete lokátor LOB

V PL/SQL by to mohlo vypadat takto:

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

Vysvětlení:

  1. inicializovat lokátor LOB =insert into blob_test values(1,empty_blob()) returning b into v_b;
  2. otevřete lokátor LOB pro zápis =dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  3. zkraťte obsah LOB, pokud jej chcete začít vyplňovat od začátku... To se provádí pomocí empty_blob() zavolejte do insert .
  4. připojujte své datové bloky k obsahu LOB ve smyčce, jeden po druhém =zde pouze jedna iterace dbms_lob.writeappend() , připojí pouze jeden blok aaa o délce utl_raw.length(aaa) (maximálně 32767) do LOB v_b
  5. zavřete lokátor LOB =dbms_lob.close(LOB_LOC=>v_b);


  1. Pomoc s uchopením (VNITŘNÍ?) JOIN

  2. Python and Django OperationalError (2006, 'MySQL server zmizel')

  3. Binární strom pomocí PHP + MySQL

  4. Proč funkce PHP crypt() vrací totéž pro dva různé řetězce?