
Создайте элемент страницы типа Файловый браузер.

Затем установите Display as: Inline Dropzone.
Тип хранилища: Таблица apex_application_temp_files ← — — здесь будут временно храниться несколько файлов.

Затем создайте процесс, который выполняет код Pl/sql.

Вот код, который сделает всю работу за вас:
DECLARE
file_names_V apex_t_varchar2;
l_zip_file BLOB;
MimeType_V varchar2(250);
Filename_V varchar2(255);
Count_fiLes_V number;
Cursor Sel_Files(f_name_V varchar2) is
SELECT filename,mime_type,blob_content
FROM apex_application_temp_files
WHERE application_id = :APP_ID
and name = f_name_V;
file_V Sel_Files%ROWTYPE;
BEGIN
-- Split the file names into an array
file_names_V := apex_string.split (
p_str => :P19_LOGFILENAME,
p_sep => ':' );
--get the number of files
SELECT COUNT(*) INTO Count_Files_V
from apex_application_temp_files;
IF Count_Files_V >1 THEN
-- Add files to the zip file
FOR i IN 1 .. file_names_V.count LOOP
-- Get the file from the temporary files table
OPEN Sel_Files(file_names_V(i));
FETCH Sel_Files into file_V;
CLOSE Sel_Files;
-- Add the file to the zip archive
apex_zip.add_file (
p_zipped_blob => l_zip_file,
p_file_name => file_V.filename,
p_content => file_V.BLOB_CONTENT
);
END LOOP;
-- Finalize the zip file
apex_zip.finish (
p_zipped_blob => l_zip_file );
--after that it is up to you how u wanna insert the zip file in the database
-- for me i created a function that update the table(columns related to the
-- file)
-- Callnumber_P VARCHAR2,
-- Log_File_Name_P BLOB,
-- Mimetype_P VARCHAR2,
-- Filename_P VARCHAR2,
-- Img_Last_Upd_P VARCHAR2,
-- Attach_Number_P NUMBER
-- Update the attachment in the database
Lgs_Calls_Pck.Upd_Attach(:P19_CALLNUMBER, l_zip_file, 'application/zip', 'download.zip', SYSDATE, 1);
ELSE
OPEN Sel_Files(file_names_V(1));
FETCH Sel_Files into file_V;
CLOSE Sel_Files;
Lgs_Calls_Pck.Upd_Attach(:P19_CALLNUMBER,file_V.BLOB_CONTENT,file_V.mime_type,file_V.filename, SYSDATE, 1);
END IF;
END;
Этот код представляет собой блок PL/SQL, который загружает файлы из формы Oracle Application Express (APEX), сжимает их в ZIP-файл, а затем сохраняет ZIP-файл в базе данных. Вот разбивка того, что происходит:
- Код объявляет несколько переменных, в том числе массив для хранения имен файлов, переменную BLOB для хранения сжатого zip-файла и переменные для хранения MIME-типа и имени файла каждого файла.
- Курсор (Sel_Files) определен для выбора имени файла, типа MIME и содержимого большого двоичного объекта из таблицы временных файлов в приложении APEX.
- Имена файлов разбиваются на массив с помощью функции apex_string.split.
- Количество загружаемых файлов определяется путем подсчета количества строк в таблице временных файлов.
- Если было загружено более одного файла, код перебирает каждый файл в массиве и извлекает информацию о нем из таблицы временных файлов с помощью курсора Sel_Files.
- Функция apex_zip.add_file используется для добавления каждого файла в zip-архив.
- После добавления всех файлов вызывается функция apex_zip.finish для финализации zip-файла.
- Если был загружен только один файл, информация о нем извлекается из таблицы временных файлов с помощью курсора Sel_Files.
- Функция Lgs_Calls_Pck.Upd_Attach вызывается для обновления вложения в базе данных zip-файлом (если было загружено более одного файла) или отдельным файлом (если был загружен только один файл).
Этот код предполагает, что в приложении APEX есть элемент страницы (P19_LOGFILENAME), который содержит имена загруженных файлов, разделенные двоеточиями. Также предполагается, что имеется пакет (Lgs_Calls_Pck) с функцией (Upd_Attach), которая может обновлять соответствующие столбцы в таблице базы данных информацией о файлах.

Если это не сработало, посмотрите, как вы обновляете ВАШУ таблицу :(
