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
- abrir el archivo para escribir
- trunque el archivo si desea comenzar a llenarlo desde cero
- lea sus datos de origen en fragmentos en un bucle
- añada sus fragmentos de datos al archivo en el mismo ciclo, uno por uno
- 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
- abrir/inicializar el localizador de LOB
- trunque el contenido de LOB, si desea comenzar a llenarlo desde cero
- añada sus fragmentos de datos al contenido LOB en un bucle, uno por uno
- 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:
- iniciar el localizador LOB =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- abrir el localizador LOB para escritura =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- trunque el contenido de LOB, si desea comenzar a llenarlo desde cero... Esto lo hace
empty_blob()
llamar alinsert
. - 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 fragmentoaaa
de longitudutl_raw.length(aaa)
(máximo de 32767) en el LOBv_b
- cerrar el localizador LOB =
dbms_lob.close(LOB_LOC=>v_b);