Saltar al contenido

PAQUETE DBMS_LOB (IV). EJEMPLOS

DBMS_LOB

Aquí os dejo algunos ejemplos del paquete DBMS_LOB:

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

DBMS_LOB ORACLE