Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verwendung der Spalte vom Typ BLOB in Oracle APEX

Speichern und Zugreifen auf Dateianhänge in BLOB-Datentypen über Oracle APEX

Hier ist das Schemadesign für die von mir verwendete Tabelle, die eine BLOB-typisierte Datenspalte enthält. Hinweis:Dies ist nicht das Design der endgültigen Lösung; Folgen Sie einfach den Änderungen, sobald sie kommen, damit Sie verstehen, was ich über einige Einschränkungen der APEX-Assistenten zur Formular- und Berichterstellung herausgefunden habe.

Erster Versuch:Einrichten der APEX-Tabelle, des Formulars und des Berichts

Tabelle:MY_DOC_STACK Erster Layoutversuch

Die Spalte DOC_FILE ist der BLOB-Typ, der den eigentlichen Dokumentanhang speichert. So sehen das Formular und der Bericht aus, die mit dem APEX-Anwendungsassistenten erstellt wurden, der direkt auf die Tabelle verweist:

HINZUFÜGEN eines DOKUMENTS zum BLOB-typisierten Feld

Die Berichtsabfrage scheint wie unten gezeigt zu funktionieren:

Hier ist eine Liste weiterer Datensätze mit Dokumentanhängen:

Beispielberichtsausgabe mit mehreren Datensätzen

Das Problem tritt auf, wenn versucht wird, die Datei herunterzuladen, die in das BLOB-Feld eingefügt wurde:

Es ist subtil aus dem Bild, aber der identifizierte Mime-Typ:Application/Octet-Stream ist ein Indikator dafür, dass das APEX-Formular den Dateityp (Microsoft Word, docx) verloren hat, den ich gerade hochgeladen hatte. Die gespeicherte Datei ist nur ein Haufen Müllzeichen. Der Versuch, die Dateiendung zu ändern, hilft auch nicht.

Zweiter (überarbeiteter) Versuch:Anpassungen am APEX-Anwendungsdesign für Blob-/Dokumentenhandhabung

Obwohl die Anwendungsregionen und ihre Komponenten nicht sofort nach Abschluss des Assistenten funktionierten, gibt es nur ein paar geringfügige Änderungen, um ihn in einen funktionsfähigen Zustand zu versetzen. Genauere Betrachtung des Formularelements PX_DOC_FILE zeigt, dass BLOB-Formularelemente einige zusätzliche Metainformationen über die an den Datensatz angehängte Datei benötigen:

Ich ging weiter und definierte die zusätzlichen Spalten und fügte sie der BLOB-enthaltenden Tabelle (MY_DOC_STACK), dem hochzuladenden Apex-Formular und der Definition des Berichtsbereichs hinzu.

Beachten Sie, dass die Spaltennamen (der Einfachheit halber) den Anforderungen des Blob-Formularelements DOC_FILE entsprechen .

Überarbeitetes Dokumentanhang-Apex-Formular

Ich dachte zunächst, man müsse schlau sein, um alle möglichen Werte von Mime-Typen (msword, pdf, zip usw.) zu antizipieren, aber das war unnötig. Ebenso für die anderen Felder, die für den Zeichentyp und die zuletzt aktualisierten Spalten reserviert sind.

Überarbeiteter Dokument-Blob-Upload-Bericht

Überarbeitete Berichtsausgabe-Diskussion

  1. [Eigentümer:AUDREY HEPBURN]:Ich habe den MIME_TYPE erzwungen mit meinem Formular zu "Bewerbung/msword"; Obwohl die Datei, die ich hochgeladen hatte, vom Typ ".docx" war, wurde sie beim erneuten Herunterladen über die Apex-Seite auf meinem lokalen Client als ".doc"-Format (das alte MS Word-Format) gespeichert.

  2. [Eigentümer:CHEVY CHASE]:Diesmal MIME_TYPE wurde nicht eingegeben und der Apex-Formularprozess/die Aktion hat dies dem Datensatz hinzugefügt, als er erstellt wurde:

    application/vnd.openxmlformats-officedocument.wordprocessingml.document

    Dies ist wahrscheinlich das von Microsoft Office 2013 festgelegte Format . Der FILE_NAME Wert war benutzerdefiniert und die Erweiterung .docx wurde explizit hinzugefügt. Das Ergebnis war, dass das Herunterladen der Datei den Benutzer dazu veranlasste, die Datei standardmäßig mit der richtigen Anwendung auf meinem Client-Computer zu öffnen:MS Word (Version 2013).

  3. [Inhaber:CARRIE FISHER]:Dasselbe wie Testfall (2), aber stattdessen wird ein Adobe PDF (Portable Document Format) verwendet. Gleiches Verhalten außer MIME_TYPE hat sich als application/pdf identifiziert; Datei wie erwartet geöffnet.

Mehr Diskussion:

All diese Probleme stammen von den generischen DML-APIs, die Apex verwendet, um Einfügungen, Aktualisierungen und Löschungen aus dem Schema der Anwendung zu verwalten, höchstwahrscheinlich ist es Teil der Härtung von Apex gegen SQL-Injection-Angriffe. Das direkte INSERT und SELECT Anweisungen, die in Ihrem SQL-Client verwendet werden, ist nicht die gleiche Art und Weise, wie ein Standardformularentwurf (von einem Anwendungsassistenten) eingerichtet wird, um DML-Transaktionen zu verwalten.

Beachten Sie, dass der Seitenprozess:Process Row of MY_DOC_STACK sieht eher parametergesteuert aus. Wenn es irgendwo einen DML-Vorgang gibt, basiert dieser zunächst auf der sorgfältigen Überprüfung jeder Eingabevariablen, die über das Apex-Formular übermittelt wird.

Es gibt viele andere Möglichkeiten, wie Apex DML-Transaktionen verwalten kann; ... diese Lösung konzentriert sich auf das, was dem OP höchstwahrscheinlich begegnet ist.

Viel Glück!