Cargar datos en campo blob desde cliente
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;
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;
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;
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;
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.
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?
¿Tiene que ser PL/SQL? ¿Podría ser una pantalla de Forms, en cliente/servidor?
Debe ser por PL/SQL. ¿No existe ninguna manera de, aunque sea, pasar el fichero al servidor previamente?
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?
