Salut,
Je souhaiterais connaître la façon d'insérer une image jpg dans un champ de type BLOB avec une clause de type INSERT ou autre.
Merci de vos réponses
:
Salut,
Je souhaiterais connaître la façon d'insérer une image jpg dans un champ de type BLOB avec une clause de type INSERT ou autre.
Merci de vos réponses
:
Alors dans l'ordre il faut
que le dba crée un lien vers un repertoire
ou c:\tmp sous windows
Code : Sélectionner tout - Visualiser dans une fenêtre à part create or replace directory carldir as '/tmp';
Ensuite tu crées une table qui contiendras tes blobs
Code : Sélectionner tout - Visualiser dans une fenêtre à part create table blobtab(index_col integer, blob_col blob);
Ensuite tu dois crées une ligne contenant un BLOB vide afin que Oracle puisse avoir un pointeur vers le BLOB
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 insert into blobtab(index_col, blob_col) values(1, empty_blob()); COMMIT;
Ensuite tu executes la procédure suivante
Et la si tout se passe bien ton image sera insérée dans la base
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 CREATE OR REPLACE PROCEDURE insert_blob (v_name VARCHAR2, v_index NUMBER) IS ablob BLOB; abfile BFILE := bfilename(v_name, 'cc'); amount INTEGER; asize INTEGER; BEGIN SELECT blob_col INTO ablob from blobtab WHERE index_col = v_index; dbms_lob.fileopen(abfile); asize := dbms_lob.getlength(abfile); dbms_output.put_line('Size of input file: ' || asize); dbms_lob.loadfromfile(ablob, abfile, asize); dbms_output.put_line('After loadfromfile'); asize := dbms_lob.getlength(ablob); dbms_output.put_line('Size of blob: ' || asize); dbms_lob.close(ablob); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('An exception occurred'); dbms_output.put_line(sqlcode || sqlerrm); END;
Merci pour ta réponse !
mais je n'arrive pas à pointer sur l'image à insérer. Pourtant le chemin de mon image est correct (je pense).
:
Arf attention j'ai oublié de préciser. Lors de la création du directory, tu devras OBLIGATOIREMENT mettre l'image a insérer dans ce repertoire sinon ca ne marchera jamais. De plus tu n'auras pas besoin ensutie de mettre le chemin complet dans l'appel de procédure mais juste le nom du fichier.
Si cela ne marche toujours pas je regarderai pour une autre méthode.
Sinon je te conseille un très très bon site http://asktom.oracle.com ou tu trouveras surement une réponse à ta question.
Malheureusement, le blob ne se remplit toujours pas avec l'image. J'ai cherché sur d'autres forums et la méthode que tu m'as donné semble être la plus utilisé mais je ne comprends toujours pas pourquoi cela ne fonctionne pas sur ma machine !
:
Quel est l'erreur que tu obtiens???
sinon voila une url ou il explique (en anglais) comment faire
http://askremi.ora-0000.com/question/show?id=318035
aucune erreur il me dit : Procédure PL/SQL terminée avec succès
Voila le code que j'utilise :
Par contre le dir Temp correspond à celui de ma machine ou à celui du serveur Oracle quand je crée le directory ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 create or replace directory carldir as '\Temp'; insert into stfichierphoto values (1,empty_blob()); CREATE OR REPLACE PROCEDURE insert_blob (v_name VARCHAR2, v_index NUMBER) IS ablob BLOB; abfile BFILE := bfilename('v_name', 'v_index'); amount INTEGER; asize INTEGER; BEGIN SELECT slefph INTO ablob from stfichierphoto WHERE spnlptofph = v_index ; dbms_lob.fileopen(abfile); asize := dbms_lob.getlength(abfile); dbms_output.put_line('Size of input file: ' || asize); dbms_lob.loadfromfile(ablob, abfile, asize); dbms_output.put_line('After loadfromfile'); asize := dbms_lob.getlength(ablob); dbms_output.put_line('Size of blob: ' || asize); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('An exception occurred'); dbms_output.put_line(sqlcode || sqlerrm); END; / execute insert_blob('toto.jpg',1); commit;
: :
Merci pour tes réponses
Ah voila c'est c:\temp sous windows et non pas \temp moi je l'avais mis au format linux désolé.
Et oui le répertoire doit correspondre a un repertoire de ton server.
Autre chose et cela est de ma faute je vais modifier cela de suite, fais un commit tout de suite apres le insert sinon cela ne validera jamais la transaction.
Si la méthode précédente n'a pas marcher je t'en remet une ici qui me semble plus simple (meme si tres tres proche)
Etape 1:
Création d'une table qui contiendra les blob
Etape 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 CREATE TABLE blobs ( id VARCHAR2(255), blob_col BLOB );
Création d'un répertoire logique dans la base permettant d'avoir un pointeur vers le disque physique.(l'exmple fonctionne pour windows)
Etape 3:
Code : Sélectionner tout - Visualiser dans une fenêtre à part CREATE OR REPLACE DIRECTORY MY_FILES AS 'c:\images';
Création de la procédure qui permettra d'insérer l'image (ici aria.gif qui devra obligatoirement exister dans c:\images)
Etape 4:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CREATE OR REPLACE PROCEDURE insert_img AS f_lob bfile; b_lob blob; BEGIN INSERT INTO blobs VALUES ( 'MyGif', empty_blob() ) RETURN blob_col INTO b_lob; f_lob := bfilename( 'MY_FILES', 'aria.gif' ); dbms_lob.fileopen(f_lob, dbms_lob.file_readonly); dbms_lob.loadfromfile( b_lob, f_lob, dbms_lob.getlength(f_lob) ); dbms_lob.fileclose(f_lob); COMMIT; END; /
Plus qu'a executer la procédure
Voila et normalement celle méthode marche sans pb (perso je l'ai teste et il m'a bien inserer le blob.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 BEGIN insert_img; END; /
Par contre si ca marche toujours pas et qu'il sort une erreur de type ORA-22285 alors je te conseille de faire un
afin de lui donner les droits en écriture.
Code : Sélectionner tout - Visualiser dans une fenêtre à part GRANT READ ON DIRECTORY MY_DIR TO <TON USER>;
Merci je vais le tester tout de suite
ta première méthode fonctionne avec quelques petites modifications:
abfile BFILE := bfilename('PAPER', v_name); v_name pas entre quotes
dbms_lob.close(ablob); ajouter
commit; avant le END
encore
Oki je modifie mon poste pour eviter le pb aux prochains lecteurs.
Bonjour
j'ai utiliser votre méthode (la derniere) pour stocker des fichiers word dans la base (oracle) et ca marche
mais je voudrai savoir comment on fait pour extraire ces document pour les modifier et les restocker apres dans la base
Merci
Alors tout va dependre de la version d'oracle sur laquelle tu travailles.
En 9i R2 tu peut utiliser UTL_FILE (pour stocker le blob dans ton fichier)
En 9i R1 et avant tu devra utiliser du java pour pouvoir stocker ton blob dans un fichier.
Ensuite tu le modifies, puis tu effaces le blob de la table et tu remet le tien à la place.
salut
j'utilise oracle 8i
il n'y a pas un moyen plus simple que java
Merci
Arf a priori non (en tout cas pas dans les docs que j'ai trouvé.
Tiens je te colle le lien pour que tu ailles jetter un coup d'oeil.
http://asktom.oracle.com/pls/ask/f?p...6379798216275,
Merci
Bonjour tout le monde,
Ex-DBA SQL , je suis maintenant positionné sur un poste de DBA oracle, eh oui comme quoi !
Pouvez-vous m'indiquer la meilleure solution ?
Je dois creer sous Oracle9i un index de fichiers images qui se trouvent physiquement sur un serveur windows et afficher les images dans une page web
1/ faut-il les inserer dans la base oracle et comment ?
2/ comment acceder au web sous Oracle9
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager