Cargar datos en campo blob desde cliente

David
30 de Enero del 2008
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.

nerea
30 de Enero del 2008
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;

fgh
30 de Enero del 2008
dfghd

nerea
30 de Enero del 2008
Antes no he copiado bien el ejemplo,.....

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;

david
30 de Enero del 2008
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.

nerea
30 de Enero del 2008
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?

david
30 de Enero del 2008
Debe ser por PL/SQL. ¿No existe ninguna manera de, aunque sea, pasar el fichero al servidor previamente?

igorcb
30 de Enero del 2008
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?