In Oracle Application Express (APEX) kann man BLOBs über „Formulare“ in die Datenbank abspeichern oder über „Reporte“ aus der Datenbank herausladen und Bilder anzeigen lassen.
Hier wird erklärt, wie man vorgehen könnte.
Voraussetzung:
CREATE TABLE "LOAD_BLOB"
("BLOB_ID" NUMBER(10,0),
"ATTACH_FILENAME" VARCHAR2(255 BYTE),
"DOCUMENT" BLOB,
"ATTACH_MIMETYPE" VARCHAR2(255 BYTE),
"ATTACH_LAST_UPDATE" DATE,
"ATTACH_CHARSET" VARCHAR2(128 BYTE),
PRIMARY KEY ("BLOB_ID")
CREATE SEQUENCE SQ_LOAD_BLOB START WITH 1;
Zuerst wird in APEX eine leere Seite vom Type „Report“ mit der Vorlage „Report with Form on Table“ erstellt:
Dann werden für den Report von der Tabelle LOAD_BLOB die Spalten BLOB_ID, ATTACH_FILENAME und DOCUMENT (Blob) ausgesucht.
Nach dem Next werden für das Formular „Select Primary Key“ (BLOB_ID) und alle Spalten gewählt. Außerdem benötigt man die „Existing Sequence“ SQ_LOAD_BLOB.
Weil die BLOB-Attribute Mime-Type, Filename, Last Updated und Character-Set im Hintergrund mit abgespeichert werden, werden die Items, die beim Erstellen des Formulars angelegt wurden und die diese Attribute beinhalten sollen, auf „Display Only“ gesetzt, so dass man sieht, was abgespeichert wird:
(Bitte passen Sie P58, das hier für Seite 58 steht, entsprechend an.)
P58_ATTACH_FILENAME: Type: Display Only
P58_ATTACH_MIMETYPE: Type: Display Only
P58_ATTACH_LAST_UPDATE: Type: Display Only
P58_ATTACH_CHARSET: Type: Display Only
Das Item P58_DOCUMENT ist vom Type “File Browse...“, so dass man darüber die entsprechende Datei, die ins BLOB geladen werden soll, auswählen kann.
Folgende Settings sind für dieses Item noch notwendig:
Automatisch werden vom Assistent der Pre-Rendering-Prozess “Fetch Row from LOAD_BLOB”, sowie die Prozesse „Process Row of LOAD_BLOB“, “Get PK” und “reset page” angelegt.
Nun wird die SQL-Query vom Source im Report angepasst:
SELECT "BLOB_ID", "ATTACH_FILENAME", DBMS_LOB.GETLENGTH("DOCUMENT") "DOCUMENT",
CASE
WHEN NVL(DBMS_LOB.GETLENGTH(DOCUMENT),0) = 0 THEN
NULL
WHEN ATTACH_MIMETYPE LIKE 'image%' THEN
'<img alt="Image" src="' ||
APEX_UTIL.GET_BLOB_FILE_SRC('P54_DOCUMENT',BLOB_ID) ||
'" height="50" width="50" />'
WHEN ATTACH_MIMETYPE LIKE '%pdf%' THEN
'<img src="#APP_IMAGES#application-pdf.png" height=50 width=50 />'
WHEN ATTACH_MIMETYPE LIKE '%powerpoint%' THEN
'<img src="#APP_IMAGES#PowerPoint.ico" height=50 width=50 />'
WHEN ATTACH_MIMETYPE LIKE '%word%' THEN
'<img src="#APP_IMAGES#docx.png" height=50 width=50 />'
WHEN ATTACH_MIMETYPE LIKE '%excel%' THEN
'<img src="#APP_IMAGES#Excel.ico" height=50 width=50 />'
WHEN ATTACH_MIMETYPE LIKE '%zip%' THEN
'<img src="#APP_IMAGES#zip-icon.png" height=50 width=50 />'
ELSE
NULL
END Application
FROM "#OWNER#"."LOAD_BLOB"
Bei diesem Statement wird ein Bild vom Type „image“, wie z. B. bei einer png- oder jpg-Datei, als Bild im Report dargestellt. Dagegen werden Dokumente wie pdf-, powerpoint-, word- oder excel-Dateien mit einem eigenen Bild abgebildet. Diese Dateien (application-pdf.png, PowerPoint.ico, docx.png, Excel.ico, zip-icon.png) werden vorher in „Shared Components“ über „Static Application Files“ in Apex hochgeladen und so der Anwendung zur Verfügung gestellt
Wichtig ist außerdem, dass man bei der Spalte Application in Security die „Escape special characters“ auf „No“ setzt, da man sonst nur HTML und nicht die Bilder sieht.
Die Spalte DOCUMENT ist vom Type „Download BLOB“ und man kann über diesen Download-Link in der Spalte die jeweilige Datei aus dem BLOB-Feld herausladen.
Die „BLOB_ID“-Spalte im Report könnte man „Hidden“ stellen.
Über das Pencil-Icon im Report kann man nun im Formular den zugehörigen Datensatz sehen bzw. löschen. Der „Create“-Button im Report leert das Formular, so dass man dort einen neuen Datensatz mit einer Datei im BLOB-Feld anlegen kann.
Hinweis:
Wenn man einen Datensatz in der Form-Region löscht, kann es passieren, dass die Session die BLOB_ID weiterhin speichert, obwohl der Datensatz nicht mehr existiert, dadurch kann es zu einem ORA-1403 „No Data found“ kommen.
Deshalb ist es ratsam, einen Pre-Rendering-Prozess vom Type „Clear Session State“, Point: „Before Header“ anzulegen, um alle Items auf der Seite zu löschen.
Viele weitere Informationen, Erklärungen und Beispiele erhalten Sie in unseren APEX Kursen! Schauen Sie doch einfach mal vorbei!