16 Stimmen

Einfügen von Bildern in BLOB Oracle 10g

Ich versuche, ein Bild in ein BLOB-Feld in einer Signatur einzufügen, das ich dann aus der Tabelle auswählen und in einem Bericht anzeigen werde. Ich kann anscheinend nicht herausfinden, wie ich das Bild in die Tabelle bekomme. Ich habe ein INSERT durchgeführt, aber als ich den Bericht renderte, wurde nur der Pfad zum Bild angezeigt 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 den String-Standort in Form eines HEX-Werts einfüge. Wie kann ich den HEX-Wert des Bildes in der Tabelle erhalten, sodass ich das Bild angezeigt bekomme, wenn ich es rendere.

17voto

tbone Punkte 14490

Sie können nicht auf ein lokales Verzeichnis von pl/sql aus zugreifen. Wenn Sie bfile verwenden, müssen Sie ein Verzeichnis (Verzeichnis erstellen) auf dem Server einrichten, auf dem Oracle läuft, und dort müssen Sie Ihre Bilder ablegen.

Wenn Sie eine Handvoll Bilder von Ihrem lokalen Rechner einfügen möchten, benötigen Sie eine Client-App, um dies zu tun. Sie können Ihre eigene schreiben, aber ich verwende normalerweise Toad dafür. Im Schema-Browser auf die Tabelle klicken. Klicken Sie auf den Daten-Tab und dann auf das +-Zeichen, um eine Zeile hinzuzufügen. Doppelklicken Sie auf die BLOB-Spalte, und ein Assistent wird geöffnet. Das Symbol weit links lädt ein Bild in den Blob:

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

Wenn Sie Bilder über das Netzwerk übertragen müssen, können Sie dies mit pl/sql tun, aber es ist nicht direkt. Zunächst müssen Sie den Zugriff auf die ACL-Liste einrichten (aus Sicherheitsgründen), um einem Benutzer das Übertragen über das Netzwerk zu ermöglichen. Sehen Sie sich den Artikel für weitere Informationen zur ACL-Einrichtung an.

Angenommen, die ACL ist komplett, würden Sie das Bild wie folgt übertragen:

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
   -- Wichtig: ACL-Zugriffsliste zuerst einrichten!

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

  -- Die Antwort in den BLOB kopieren.
  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.

10voto

Dmitry Nikiforov Punkte 2998

Sie sollten etwas Ähnliches tun:

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

CREATE DIRECTORY image_files AS '/data/images'
/

2) Legen Sie Ihre Datei in den Betriebssystemordner, auf den das Verzeichnisobjekt zeigt

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

GRANT READ ON DIRECTORY image_files TO scott
/

4) Verwenden Sie die BFILENAME-, EMPTY_BLOB-Funktionen und das DBMS_LOB-Paket (Beispiel nicht getestet - Vorsicht), wie unten gezeigt:

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

Nach diesem Schritt erhalten Sie den Inhalt Ihrer Datei in der BLOB-Spalte und können diesen z.B. mit Java zurückholen.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X