wake-up-neo.com

Einfügen eines Bildes in BLOB Oracle 10g

Ich versuche, ein Bild in ein BLOB-Feld in einer Signatur einzufügen, die ich dann aus der Tabelle auswähle und in einem Bericht rendere. Ich kann mir nicht vorstellen, wie ich das Bild in den Tisch bekommen soll. Ich habe jedoch eine Einfügung gemacht, als ich nur den Pfad zum Bild renderte, der im Bericht angezeigt wurde, und nicht das Bild selbst.

Tabelle

CREATE TABLE esignatures (
  office   NUMBER(6,0)  NOT NULL,
  username VARCHAR2(10) NOT NULL,
  iblob    BLOB         NOT NULL
)

INSERT-Anweisung (SQL)

INSERT INTO esignatures  
VALUES (100, 'BOB', utl_raw.cast_to_raw('C:\pictures\image1.png'));

Ich weiß sicher, dass ich die Zeichenfolge-Position in Form eines HEX-Werts einfüge. Wie kann ich den Bild-HEX-Wert in der Tabelle abrufen, damit beim Rendern das Bild angezeigt wird?.

13
devdar

Sie können von pl/sql aus nicht auf ein lokales Verzeichnis zugreifen. Wenn Sie bfile verwenden, richten Sie auf dem Server, auf dem Oracle ausgeführt wird, ein Verzeichnis ( create directory ) ein, in dem Sie Ihre Images ablegen müssen.

Wenn Sie eine Handvoll Bilder von Ihrem lokalen Computer einfügen möchten, benötigen Sie dazu eine clientseitige App. Du kannst deine eigene schreiben, aber ich benutze normalerweise Toad dafür. Klicken Sie im Schema-Browser auf die Tabelle. Klicken Sie auf die Registerkarte Daten und drücken Sie +, um eine Zeile hinzuzufügen. Doppelklicken Sie auf die BLOB-Spalte. Ein Assistent wird geöffnet. Das Symbol ganz links lädt ein Bild in den Blob:

enter image description here

SQL Developer hat eine ähnliche Funktion. Siehe den Link "Laden" unten:

enter image description here

Wenn Sie Bilder über den Draht ziehen müssen, können Sie dies mit pl/sql tun, aber es ist nicht einfach. Zunächst müssen Sie den Zugriff auf die ACL-Liste einrichten (aus Sicherheitsgründen), damit ein Benutzer über die Leitung ziehen kann. In diesem Artikel finden Sie weitere Informationen zum Einrichten von ACLs.

Vorausgesetzt, die ACL ist vollständig, würden Sie das Bild folgendermaßen ziehen:

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;

Ich hoffe, das hilft.

16
tbone

Sie sollten so etwas tun:

1) Erstellen Sie ein Verzeichnisobjekt, das auf einen serverseitig zugänglichen Ordner verweist

CREATE DIRECTORY image_files AS '/data/images'
/

2) Platzieren Sie Ihre Datei in dem OS-Ordner, auf den das Verzeichnis zeigt

3) Geben Sie dem Oracle-Schema die erforderlichen Zugriffsrechte, um die Daten aus der Datei in die Tabelle zu laden:

GRANT READ ON DIRECTORY image_files TO scott
/

4) Verwenden Sie die Funktionen BFILENAME, EMPTY_BLOB und das Paket DBMS_LOB (Beispiel NICHT getestet - seien Sie vorsichtig) wie folgt:

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

Danach erhalten Sie den Inhalt Ihrer Datei in der BLOB-Spalte und können ihn beispielsweise mit Java zurückholen.

edit: Ein Buchstabe fehlt noch: Es sollte LOADFROMFILE sein.

8