Bonjour,
Dans le but d'insérer un champ BLOB ainsi que de le lire (SELECT), je connais grâce à l'article d'Helyos (http://helyos.developpez.com/lob/) que l'on peut pas faire un INSERT basique sur un blob et de même pour le select !!
J'ai alors essayé l'exemple d'Helyos (partie BLOBs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| CONNECT system / < pass >
CREATE directory blobdir AS 'c:\temp\';
GRANT READ ON directory blobdir TO scott;
CREATE TABLE scott.t_blob (id number, image blob);
CREATE OR REPLACE PACKAGE scott.sql_blob IS
-- Procédure servant à ajouter un BLOB à notre table.
-- p_id correspond à l'id
-- p_name correspond au nom du fichier à inserer.
PROCEDURE add_blob(p_id NUMBER, p_name VARCHAR2);
END sql_blob;
/
CREATE OR REPLACE PACKAGE BODY scott.sql_blob IS
PROCEDURE add_blob(p_id NUMBER, p_name VARCHAR2) IS
v_blob BLOB;
v_bfile BFILE;
BEGIN
-- On insére la ligne avec un blob vide dont on récupère le pointeur
INSERT INTO t_blob
VALUES
(p_id, empty_blob())
RETURNING image INTO v_blob;
-- On déclare un pointeur vers notre fichier
v_bfile := bfilename(directory => 'BLOBDIR', filename => p_name);
-- On ouvre ce fichier
dbms_lob.fileopen(v_bfile);
-- On rempli l'emplacement du BLOB vide dans la table avec le contenu de notre fichier
dbms_lob.loadfromfile(v_blob, v_bfile, dbms_lob.getlength(v_bfile));
-- On ferme le fichier
dbms_lob.fileclose(v_bfile);
END;
END sql_blob;
/ |
Tout est OK jusque là mais lorsqu'on teste enfin la procédure du package:
exec sql_blob.add_blob(1,'toto.bmp');
De même
exec scott.sql_blob.add_blob(1,'C:\temp\toto.bmp');
L'erreur est :
ERREUR à la ligne 1 :
ORA-22288: échec de l'opéation FILEOPEN sur le fichier ou le LOB
Le fichier spécifié est introuvable.
ORA-06512: à "SYS.DBMS_LOB", ligne 504
ORA-06512: à "SCOTT_BLOB", ligne 15
ORA-06512: à ligne 1
Or, ce fichier toto.bmp existe bel et bien
Partager