J'essaie d'insérer une image dans un champ BLOB dans une signature que je vais ensuite sélectionner dans le tableau et rendre sur un rapport. Je n'arrive pas à comprendre comment obtenir l'image dans le tableau. J'ai fait une insertion cependant quand je rendais seulement le chemin vers l'image a été montré sur le rapport et pas l'image elle-même.
Tablea
CREATE TABLE esignatures (
office NUMBER(6,0) NOT NULL,
username VARCHAR2(10) NOT NULL,
iblob BLOB NOT NULL
)
Instruction INSERT (SQL)
INSERT INTO esignatures
VALUES (100, 'BOB', utl_raw.cast_to_raw('C:\pictures\image1.png'));
Je sais à coup sûr que j'insère l'emplacement de la chaîne sous la forme d'une valeur HEX, comment puis-je obtenir la valeur HEX de l'image dans le tableau, donc lorsque je rendrai, je verrai l'image affichée.
Vous ne pouvez pas accéder à un répertoire local à partir de pl/sql. Si vous utilisez bfile, vous configurerez un répertoire ( create directory ) sur le serveur sur lequel s'exécute Oracle où vous devrez placer vos images.
Si vous souhaitez insérer une poignée d'images de votre ordinateur local, vous aurez besoin d'une application côté client pour ce faire. Vous pouvez écrire le vôtre, mais j'utilise généralement Toad pour cela. Dans le navigateur de schéma, cliquez sur la table. Cliquez sur l'onglet données et appuyez sur le signe + pour ajouter une ligne. Double-cliquez sur la colonne BLOB et un assistant s'ouvre. L'icône à l'extrême gauche chargera une image dans le blob:
SQL Developer a une fonctionnalité similaire. Voir le lien "Charger" ci-dessous:
Si vous avez besoin de tirer des images sur le fil, vous pouvez le faire en utilisant pl/sql, mais ce n'est pas simple. Tout d'abord, vous devrez configurer l'accès à la liste ACL (pour des raisons de sécurité) pour permettre à un utilisateur de passer le fil. Voir cet article pour plus d'informations sur la configuration de l'ACL.
En supposant que l'ACL est terminée, vous tireriez l'image comme ceci:
declare
l_url varchar2(4000) := 'http://www.oracleimg.com/us/assets/12_c_navbnr.jpg';
l_http_request UTL_HTTP.req;
l_http_response UTL_HTTP.resp;
l_raw RAW(2000);
l_blob BLOB;
begin
-- Important: setup ACL access list first!
DBMS_LOB.createtemporary(l_blob, FALSE);
l_http_request := UTL_HTTP.begin_request(l_url);
l_http_response := UTL_HTTP.get_response(l_http_request);
-- Copy the response into the BLOB.
BEGIN
LOOP
UTL_HTTP.read_raw(l_http_response, l_raw, 2000);
DBMS_LOB.writeappend (l_blob, UTL_RAW.length(l_raw), l_raw);
END LOOP;
EXCEPTION
WHEN UTL_HTTP.end_of_body THEN
UTL_HTTP.end_response(l_http_response);
END;
insert into my_pics (pic_id, pic) values (102, l_blob);
commit;
DBMS_LOB.freetemporary(l_blob);
end;
J'espère que ça t'as aidé.
Vous devriez faire quelque chose comme ça:
1) créer un objet répertoire qui pointerait vers un dossier accessible côté serveur
CREATE DIRECTORY image_files AS '/data/images'
/
2) Placez votre fichier dans le dossier du dossier du système d'exploitation pointe vers
3) Accordez les privilèges d'accès requis au schéma Oracle pour charger les données du fichier dans la table:
GRANT READ ON DIRECTORY image_files TO scott
/
4) Utilisez BFILENAME, les fonctions EMPTY_BLOB et le package DBMS_LOB (exemple NON testé - soyez prudent) comme ci-dessous:
DECLARE
l_blob BLOB;
v_src_loc BFILE := BFILENAME('IMAGE_FILES', 'myimage.png');
v_amount INTEGER;
BEGIN
INSERT INTO esignatures
VALUES (100, 'BOB', empty_blob()) RETURN iblob INTO l_blob;
DBMS_LOB.OPEN(v_src_loc, DBMS_LOB.LOB_READONLY);
v_amount := DBMS_LOB.GETLENGTH(v_src_loc);
DBMS_LOB.LOADFROMFILE(l_blob, v_src_loc, v_amount);
DBMS_LOB.CLOSE(v_src_loc);
COMMIT;
END;
/
Après cela, vous obtenez le contenu de votre fichier dans la colonne BLOB et vous pouvez le récupérer en utilisant Java par exemple.
edit: Une lettre restante manquante: elle devrait être LOADFROMFILE.