Inserting Image Into BLOB Oracle 10g

前端 未结 2 608
[愿得一人]
[愿得一人] 2020-12-14 20:11

I am trying to insert an image into an BLOB field in a signatures which i will then select from the table and render on a report. I cannot seem to figure how to get the imag

相关标签:
2条回答
  • 2020-12-14 20:51

    You cannot access a local directory from pl/sql. If you use bfile, you will setup a directory (create directory) on the server where Oracle is running where you will need to put your images.

    If you want to insert a handful of images from your local machine, you'll need a client side app to do this. You can write your own, but I typically use Toad for this. In schema browser, click onto the table. Click the data tab, and hit + sign to add a row. Double click the BLOB column, and a wizard opens. The far left icon will load an image into the blob:

    enter image description here

    SQL Developer has a similar feature. See the "Load" link below:

    enter image description here

    If you need to pull images over the wire, you can do it using pl/sql, but its not straight forward. First, you'll need to setup ACL list access (for security reasons) to allow a user to pull over the wire. See this article for more on ACL setup.

    Assuming ACL is complete, you'd pull the image like this:

    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;
    

    Hope that helps.

    0 讨论(0)
  • 2020-12-14 20:53

    You should do something like this:

    1) create directory object what would point to server-side accessible folder

    CREATE DIRECTORY image_files AS '/data/images'
    /
    

    2) Place your file into OS folder directory object points to

    3) Give required access privileges to Oracle schema what will load data from file into table:

    GRANT READ ON DIRECTORY image_files TO scott
    /
    

    4) Use BFILENAME, EMPTY_BLOB functions and DBMS_LOB package (example NOT tested - be care) like in below:

    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;
    /
    

    After this you get the content of your file in BLOB column and can get it back using Java for example.

    edit: One letter left missing: it should be LOADFROMFILE.

    0 讨论(0)
提交回复
热议问题