Oracle
 sql >> Base de données >  >> RDS >> Oracle

Insertion d'une image dans BLOB Oracle 10g

Vous ne pouvez pas accéder à un répertoire local à partir de pl/sql. Si vous utilisez bfile, vous configurerez un répertoire (répertoire de création) sur le serveur sur lequel Oracle s'exécute, où vous devrez placer vos images.

Si vous souhaitez insérer une poignée d'images à partir de votre ordinateur local, vous aurez besoin d'une application côté client pour le 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 des 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 la plus à 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 tirer sur le fil. Consultez cet article pour en savoir plus sur la configuration d'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 aide.