sql >> Base de Datos >  >> RDS >> Oracle

Inserte una cadena de prueba BLOB de más de 2000 o 4000 bytes

Para empezar, debe comprender qué son los LOB. Son "datos grandes", posiblemente más grandes que cualquier otro tipo de datos en Oracle. Son como archivos regulares en un sistema de archivos. Para escribir en un archivo en un sistema de archivos, tendrá que

  1. abrir el archivo para escribir
  2. trunque el archivo si desea comenzar a llenarlo desde cero
  3. lea sus datos de origen en fragmentos en un bucle
  4. añada sus fragmentos de datos al archivo en el mismo ciclo, uno por uno
  5. cerrar el archivo

Más o menos lo mismo es cierto para los LOB. En su tabla, una columna LOB (CLOB/BLOB/NCLOB) es solo un puntero/referencia a otro lugar en su almacenamiento en disco que contiene los datos reales. En términos estándar de Oracle, el puntero se denomina "localizador de LOB". Necesitas

  1. abrir/inicializar el localizador de LOB
  2. trunque el contenido de LOB, si desea comenzar a llenarlo desde cero
  3. añada sus fragmentos de datos al contenido LOB en un bucle, uno por uno
  4. cerrar el localizador LOB

En PL/SQL podría verse así:

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

Una explicación:

  1. iniciar el localizador LOB =insert into blob_test values(1,empty_blob()) returning b into v_b;
  2. abrir el localizador LOB para escritura =dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  3. trunque el contenido de LOB, si desea comenzar a llenarlo desde cero... Esto lo hace empty_blob() llamar al insert .
  4. añada sus fragmentos de datos al contenido LOB en un bucle, uno por uno =aquí solo una iteración de dbms_lob.writeappend() , agregando solo un fragmento aaa de longitud utl_raw.length(aaa) (máximo de 32767) en el LOB v_b
  5. cerrar el localizador LOB =dbms_lob.close(LOB_LOC=>v_b);