web-dev-qa-db-fra.com

Insertion d'une image dans BLOB Oracle 10g

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.

13
devdar

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:

enter image description here

SQL Developer a une fonctionnalité similaire. Voir le lien "Charger" ci-dessous:

enter image description here

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é.

16
tbone

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.

8
Dmitry Nikiforov