Privacidad: Recuerde que la información escrita en los foros de programación es 100% pública y que su ip será registrada asociada a su mensaje. Si encuentra un mensaje fuera de lugar, por favor, notifiquelo para su revisión y eliminación.
Cargar datos en campo blob desde cliente
Enviado por David el día 19 de septiembre de 2003
Necesitamos saber cómo se podría (en caso de poderse) cargar datos en un campo blob sabiendo que el fichero de origen va a estar en una máquina cliente usando un proceso PL/SQL. Gracias.
Puedes utilizar el paquete DBMS_LOB, y la función loadfromfile. Un ejemplo:
Primero tienes que crear un directorio:
create or replace directory "LOBMANIP" as '/home/ficheros';
CREATE OR REPLACE PROCEDURE load_lob IS temp_blob BLOB; file_on_os BFILE := bfilename('LOBMANIP', 'append.sql'); ignore INTEGER; BEGIN ignore := dbms_lob.fileexists(file_on_os); IF ignore=1 THEN ignore := dbms_lob.fileisopen(file_on_os); IF (ignore=1) THEN null; ELSE dbms_lob.fileopen(file_on_os, dbms_lob.file_readonly); END IF; SELECT video_clip INTO temp_blob FROM lob_store WHERE lob_id = 5 FOR UPDATE; dbms_output.put_line('External file size is: ' || dbms_lob.getlength(file_on_os)); dbms_lob.loadfromfile(temp_blob,file_on_os, dbms_lob.getlength(file_on_os)); dbms_lob.fileclose(file_on_os); dbms_output.put_line('Internal BLOB size is: ' || dbms_lob.getlength(temp_blob)); ELSE dbms_output.put_line('File does not exist'); END IF; COMMIT; END;
CREATE OR REPLACE DIRECTORY "LOBMANIP" AS '/home/ficheros';
CREATE OR REPLACE PROCEDURE load_lob IS
temp_blob BLOB;
file_on_os BFILE := bfilename('LOBMANIP', 'append.sql');
ignore INTEGER;
BEGIN
ignore := dbms_lob.fileexists(file_on_os);
IF ignore=1 THEN
ignore := dbms_lob.fileisopen(file_on_os);
IF (ignore=1) THEN
null;
ELSE
dbms_lob.fileopen(file_on_os, dbms_lob.file_readonly);
END IF;
SELECT video_clip INTO temp_blob FROM lob_store WHERE lob_id = 5 FOR UPDATE;
dbms_output.put_line('External file size is: ' ||
dbms_lob.getlength(file_on_os));
dbms_lob.loadfromfile(temp_blob,file_on_os, dbms_lob.getlength(file_on_os));
dbms_lob.fileclose(file_on_os);
dbms_output.put_line('Internal BLOB size is: ' ||
dbms_lob.getlength(temp_blob));
ELSE
dbms_output.put_line('File does not exist');
END IF;
COMMIT;
END;
Re: Re: Re: Cargar datos en campo blob desde cliente
Enviado por david el día 19 de septiembre de 2003
El problema es que esto funciona si el fichero a pasar a la bbdd está en el servidor. Nosotros tenemos el fichero en el cliente y por esta vía Oracle no es capaz de localizar nuestro fichero.
Re: Re: Re: Re: Cargar datos en campo blob desde cliente
Enviado por nerea el día 19 de septiembre de 2003
Entonces no lo puedes hacer por PL/SQL, ya que el procedimiento almacenado se ejecuta en la base de datos.... tendrías que transferir el fichero primero.
¿Tiene que ser PL/SQL? ¿Podría ser una pantalla de Forms, en cliente/servidor?
Yo tengo el mismo requerimiento, pero no necesito que el código sea PL/SQL me sirve un Forms, mi problema es que como los archivos no son necesariamente sonidos o imágenes entonces no puedo usar READ_IMAGE_FILE. Mi aplicación debe poder guardar cualquier tipo de archivo y también recuperarlo en el cliente ¿Alguien me puede ayudar?
¿ Por que no pruebas a transferir el fichero de tu maquina cliente al servidor via FTP ?
Hay un paquete que lo puede hacer, no me acuerdo como se llama, algo parecido a UTL_FTP o algo así.
Si puedes esperar hasta el miercoles, te mando uno que utilizamos nosotros para esos menesteres.
Es que ahora estoy de vacaciones, je je je je
PD : Pero tienes que poner un post para recordarmelo....