BLOB datos PDF

cessaar1
03 de Septiembre del 2004
Hola. tengo un problema con el tipo de datos blob, sucede que intento actualizar e insertar datos en campos de dato de tipo BLOB a una tabla. En especifico quiero subir un archivo PDF, pero no encuentro la forma. Ya intente con el empty_blob() y no hayo la forma de indicarle que me suba el archivo ubicado en algún directorio en especifico. ¿alguien me puede ayudar?

Jorge-DBA
03 de Septiembre del 2004
Que tal Cesar:

Creo entender que lo que necesitas es subir información de texto binaria no estructurada con formato PDF, si es asi, Tengo una Base de datos donde subi PDF's, se suben con el Store Procedure de Oracle

"dbms_lob"

Existen varias formas de subir esta información, te envio un ejemplo:

Paso 1:

crear en el Database Server un path Válido y escribes tu archivo PDF en dicho path:

Ejemplo:

C:temp

Paso 2

Dentro de tu base de datos, crear un usuario con privilegios de Resource y connect y asignar un tablespace exclusivo para la carga de PDF's

Paso 4:

Crear el directorio en la base de datos con un usuario con privilegios de sysdba

ejemplo:

SQL> connect / as sysdba

SQL> create directory dir_pdfs as 'C:temp'
/

Paso 3:

Desde un usuario con privilegios de sysdba concedes el privilegio de READ al usuario donde que creamos en el paso 2:

Ejemplo

SQL> connect / as sysdba

SQL>grant read on directory "DIR_PDFS" to user
/

Paso 4:
Creas la tabla en el usuario que creamos en el paso 2 e insertas un registro de la siguinete manera:

create table pdffiles (id number(3) primary key, description varchar2(20), text blob default empty_blob())
/
insert into pdffiles(id, description) values(1, 'InterMedia Concepts');
commit;

Paso 5:

Creas un Store procedure indicando que vamos a almecenar la información por medio de bloques PLSQL.

CREATE OR REPLACE PROCEDURE loadpdf IS
Dest_loc BLOB;
Src_loc BFILE := BFILENAME('DIR_PDFS', 'archivo.pdf');
Amount INTEGER := 16165;
BEGIN
update tab_rep_pdf set id=1;
SELECT text INTO Dest_loc FROM pdffiles WHERE id = 1 FOR UPDATE;
/* Opening the LOB is mandatory: */
DBMS_LOB.OPEN(Src_loc, DBMS_LOB.LOB_READONLY);
/* Opening the LOB is optional: */
DBMS_LOB.OPEN(Dest_loc, DBMS_LOB.LOB_READWRITE);
DBMS_LOB.LOADFROMFILE(Dest_loc, Src_loc, Amount);
/* Closing the LOB is mandatory if you have opened it: */
DBMS_LOB.CLOSE(Dest_loc);
DBMS_LOB.CLOSE(Src_loc);
COMMIT;
END;
/

En la linea:
Src_loc BFILE := BFILENAME('DIR_PDFS', 'archivo.pdf');
"'archivo.pdf' es tu nombre de tu archivo PDF
y en la linea:
Amount INTEGER := 16165;
Pones la medida en bytes del archivo.

y ejecutas el storeprocedure:

SQL>execute loadpdf

cuando ejecutes el StoreProcedure creado lo que hará será un update actualizando el registro creado inicialmente y teniendo en el campo BLOB el archivo PDF.

Espero que te sea de utilidad esta información

Saludos:

Jorge-DBA