PAQUETE DBMS_LOB (IV). EJEMPLOS
Aquí os dejo algunos ejemplos de este paquete:
–1º Ejemplo datos clob y blob (internos)
CREATE TABLE prueba (id NUMBER, col_clob CLOB, col_blob BLOB, col_bfile bfile); DECLARE v_blob BLOB; BEGIN -- Inicializa col_clob con la cadena especificada INSERT INTO prueba(id,col_clob,col_blob,col_bfile) VALUES (1,'abcdefghijklmnopqrstuvxyz',empty_blob(),NULL); -- Modifica col_blob para la misma fila UPDATE prueba SET col_blob = Hextoraw('00FF00FF00FF') WHERE id = 1; END; /
–2º Ejemplo : Manipulación de datos BFILE.
--Creación de un directorio CREATE Directory DIRECTORIO AS 'C:\Ficheros' ; GRANT READ ON directory DIRECTORIO TO public; -- Ejemplo de inserción de objeto BFILE -- Cuidado con las mayúsculas y con guión bajo INSERT INTO prueba (id,col_bfile) VALUES(2,bfilename('DIRECTORIO','empleados.txt'));
–3º Ejemplo: Función BFILEEXISTS
DECLARE v_valor NUMBER; v_col_bfile bfile; BEGIN SELECT col_bfile INTO v_col_bfile FROM prueba WHERE id=2; v_valor := dbms_lob.fileexists(v_col_bfile); IF v_valor = 0 THEN dbms_output.put_line('Existe'); elsif v_valor = 1 THEN dbms_output.put_line('No Existe'); END IF; END; /
– 4º Ejemplo: Función FILEGETNAME
DECLARE v_col_bfile bfile; v_dir_alias varchar2(100); v_fichero varchar2(100); BEGIN SELECT col_bfile INTO v_col_bfile FROM prueba WHERE id=2; dbms_lob.filegetname(v_col_bfile,v_dir_alias,v_fichero); dbms_output.put_line('Directorio: '||v_dir_alias); dbms_output.put_line('Fichero: '||v_fichero); END; /
– 5º Ejemplo: Función FILEOPEN y FILECLOSE
-- (Abrir y Cerrar un BFILE) Similar a UTL_FILE DECLARE v_col_bfile bfile; BEGIN v_col_bfile := bfilename('DIRECTORIO','empleados.txt'); dbms_lob.fileopen(v_col_bfile); dbms_output.put_line('Abriendo fichero'); dbms_lob.fileclose(v_col_bfile); dbms_output.put_line('Fichero cerrado'); END; / -- Si la columna clob está vacía no funciona. Se requiere el for update INSERT INTO prueba (id,col_bfile,col_clob) VALUES(2,bfilename('DIRECTORIO','empleados.txt'),empty_clob());
–6º Ejemplo: Función LOADFROMFILE y GETLENGTH
DECLARE v_col_bfile bfile; v_dest_lob CLOB; BEGIN SELECT col_clob INTO v_dest_lob FROM prueba WHERE id=2 FOR UPDATE; v_col_bfile := bfilename('DIRECTORIO','empleados.txt'); dbms_lob.fileopen(v_col_bfile); dbms_lob.loadfromfile(v_dest_lob,v_col_bfile,dbms_lob.getlength(v_col_bfile)); UPDATE prueba SET col_clob = v_dest_lob WHERE id = 2; commit; dbms_lob.fileclose(v_col_bfile); END; / -- Ver en SQL-PLUS el Clob SELECT col_clob FROM prueba WHERE id = 6;
– 7º Ejemplo: Función COMPARE
-- Primero Copiamos fichero anterior en S.O. (fichero_copia) DECLARE v_valor NUMBER; v_col_bfile bfile; v_col_bfile_bis bfile; BEGIN v_col_bfile := bfilename('DIRECTORIO','Fichero.txt'); v_col_bfile_bis := bfilename('DIRECTORIO','Fichero_copia.txt'); dbms_lob.fileopen(v_col_bfile); dbms_lob.fileopen(v_col_bfile_bis); v_valor:= dbms_lob.compare(v_col_bfile,v_col_bfile_bis,25); dbms_lob.fileclose(v_col_bfile_bis); dbms_lob.fileclose(v_col_bfile); IF v_valor = 0 THEN dbms_output.put_line('ficheros Iguales'); ELSE dbms_output.put_line('Ficheros Diferentes'); END IF; END; /
–8º Ejemplo Función READ simple
DECLARE v_dest_lob CLOB; v_contenido varchar2(1000); v_longitud INTEGER:=20; -- longitud de linea v_pos INTEGER:=1; BEGIN SELECT col_clob INTO v_dest_lob FROM prueba WHERE id=6 FOR UPDATE; -- Lee y muestra los primeros v_longitud caracteres a partir de la posicion v_pos dbms_lob.READ(v_dest_lob,v_longitud,v_pos,v_contenido); dbms_output.put_line('Contenido:'||v_contenido); exception WHEN no_data_found THEN NULL; END; /
–9º Ejemplo Función READ con bucle
DECLARE v_dest_lob CLOB; v_contenido varchar2(1000); v_longitud INTEGER:=20; -- longitud de linea v_pos INTEGER:=1; BEGIN SELECT col_clob INTO v_dest_lob FROM prueba WHERE id=4 FOR UPDATE; loop -- Lee y muestra los primeros v_longitud caracteres a partir de la posicion v_pos dbms_lob.READ(v_dest_lob,v_longitud,v_pos,v_contenido); dbms_output.put_line('Contenido:'||v_contenido); v_pos := v_pos + v_longitud; END loop; exception WHEN no_data_found THEN NULL; END; /
– 10º Ejemplo WRITE
DECLARE v_dest_lob CLOB; v_contenido varchar2(19):='Hola ¿Como estamos?'; v_pos NUMBER:=1; BEGIN SELECT col_clob INTO v_dest_lob FROM prueba WHERE id=4 FOR UPDATE; dbms_lob.WRITE(v_dest_lob,19,v_pos,v_contenido); END; /
– 11º Ejemplo SUBSTR
DECLARE v_dest_lob CLOB; v_contenido varchar2(20); v_longitud NUMBER:=20; v_pos NUMBER:=1; BEGIN SELECT col_clob INTO v_dest_lob FROM prueba WHERE id=6 FOR UPDATE; -- Lee y muestra los primeros v_longitud caracteres a partir de la posicion v_pos v_contenido := dbms_lob.substr(v_dest_lob,v_longitud,v_pos); dbms_output.put_line('Contenido:'||v_contenido); END; /
– 12º Ejemplo APPEND
-- Abrimos fichero nuevo llamado fichero_prueba e insertamos reg nuevo INSERT INTO prueba (id,col_clob) VALUES(9,empty_clob()); -- Lo insertamos en la columna LOB mediante ejemplo 6 -- Añadimos el contenido del 6 al 9 DECLARE v_lob CLOB; v_lob_bis CLOB; BEGIN SELECT col_clob INTO v_lob FROM prueba WHERE id=6 FOR UPDATE; SELECT col_clob INTO v_lob_bis FROM prueba WHERE id=9 FOR UPDATE; -- Añade el contenido del CLOB v_lob (6) al v_lob_bis(9) dbms_lob.append(v_lob_bis,v_lob); END; /
– 13º Ejemplo COPY
DECLARE v_lob CLOB; v_lob_bis CLOB; v_tamano NUMBER:= 20; BEGIN SELECT col_clob INTO v_lob FROM prueba WHERE id=6 FOR UPDATE; SELECT col_clob INTO v_lob_bis FROM prueba WHERE id=10 FOR UPDATE; -- Añade el contenido del CLOB v_lob (6) al v_lob_bis(10) los -- primeros v_tamano caracteres dbms_lob.copy(v_lob_bis,v_lob,v_tamano); END; /
– 14º Ejemplo ERASE
DECLARE v_lob CLOB; v_tamano NUMBER:= 5; -- Borramos unas lineas -- v_tamano_todo number:= 50; -- Borramos todo BEGIN SELECT col_clob INTO v_lob FROM prueba WHERE id=10 FOR UPDATE; -- Borra los primeros v_tamano caracteres del CLOB de 10 dbms_lob.erase(v_lob,v_tamano); -- Borra todo el CLOB -- dbms_lob.erase(v_lob,v_tamano_todo); END; /