sql >> Base de Datos >  >> RDS >> Oracle

Uso de columna tipo BLOB en Oracle APEX

Almacenamiento y acceso a archivos adjuntos en tipos de datos BLOB a través de Oracle APEX

Aquí está el diseño del esquema para la tabla que utilicé, que contiene una columna de datos tipo BLOB. Nota:este no será el diseño de la solución final; simplemente siga los cambios a medida que se presenten para que pueda comprender lo que descubrí sobre algunas limitaciones de los asistentes de creación de informes y formularios de APEX.

Primer intento:configurar la tabla, el formulario y el informe de APEX

Tabla:MY_DOC_STACK Primer intento de diseño

La columna DOC_FILE es el tipo BLOB que almacena el documento adjunto real. Este es el aspecto del formulario y el informe creados con el asistente de aplicación APEX que apunta directamente a la tabla:

AGREGAR un DOCUMENTO al campo escrito BLOB

La consulta del informe parece funcionar como se muestra a continuación:

Aquí hay una lista de más registros con documentos adjuntos:

Salida de informe de muestra con varios registros

El problema es al intentar descargar el archivo que se puso en el campo BLOB:

Es sutil en la imagen, pero el tipo mimo identificado:Application/Octet-Stream es un indicador de que el formulario APEX ha perdido la pista del tipo de archivo (Microsoft Word, docx) que acababa de cargar. El archivo guardado es solo un montón de caracteres basura. Intentar cambiar la extensión del archivo tampoco ayuda.

Segundo intento (revisado):Ajustes en el diseño de la aplicación APEX para el manejo de blobs/documentos

Aunque las regiones de la aplicación y sus componentes no funcionaron inmediatamente después de que se completó el asistente, solo hay algunas ediciones menores para ponerlo en condiciones de funcionamiento. Inspección más detallada del elemento de formulario PX_DOC_FILE muestra que los elementos de formulario BLOB requieren metainformación adicional sobre el archivo adjunto al registro:

Seguí adelante, definí las columnas adicionales y las agregué a la tabla que contiene BLOB (MY_DOC_STACK), el formulario Apex de carga y la definición de la región del informe.

Tenga en cuenta que los nombres de las columnas (para simplificar) se han hecho iguales a los requisitos del elemento de formulario Blob DOC_FILE .

Formulario Apex de documento adjunto revisado

Inicialmente pensé que uno tenía que ser inteligente para anticipar todos los valores posibles de Mime Types (msword, pdf, zip, etc.) pero eso era innecesario. Lo mismo ocurre con los demás campos reservados para tipo de carácter y las últimas columnas actualizadas.

Informe de carga de blobs en documentos revisado

Discusión de resultados de informes revisados

  1. [Propietario:AUDREY HEPBURN]:forcé el MIME_TYPE con mi formulario a "Aplicación/msword"; aunque el archivo que cargué era del tipo ".docx", al volver a descargarlo a través de la página de Apex se guardó en mi cliente local como formato ".doc" (el antiguo formato de MS Word).

  2. [Propietario:CHEVY CHASE]:esta vez, MIME_TYPE no se ingresó y el proceso/acción del formulario de Apex agregó esto al registro cuando se creó:

    aplicación/vnd.openxmlformats-officedocument.wordprocessingml.document

    Este probablemente sea el formato designado por Microsoft Office 2013 . El FILE_NAME el valor fue definido por el usuario y la extensión .docx se agregó explícitamente. El resultado fue que al descargar el archivo, el usuario de manera predeterminada abrió el archivo usando la aplicación correcta en mi computadora cliente:MS Word (Versión 2013).

  3. [Propietario:CARRIE FISHER]:Igual que el caso de prueba (2) pero usando un Adobe PDF (formato de documento portátil) en su lugar. Mismo comportamiento excepto el MIME_TYPE se identificó como application/pdf; archivo abierto como se esperaba.

Más discusión:

Todo este problema proviene de las API DML genéricas que Apex usa para administrar las inserciones, actualizaciones y eliminaciones del esquema de la aplicación; lo más probable es que sea parte del fortalecimiento de Apex contra los ataques de inyección SQL. El INSERT directo y SELECT Las declaraciones utilizadas en su cliente SQL no es la misma forma en que se configura un diseño de formulario predeterminado (desde un asistente de aplicación) para administrar transacciones DML.

Tenga en cuenta que la página procesa:Process Row of MY_DOC_STACK parece más controlado por parámetros. Si hay una operación DML en alguna parte, se basará primero en la selección cuidadosa de cada variable de entrada enviada a través del formulario de Apex.

Hay muchas otras formas en que Apex puede administrar transacciones DML; ... esta solución se centra en lo que probablemente encontró el OP.

¡Buena suerte!