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

Затем установите 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), которая может обновлять соответствующие столбцы в таблице базы данных информацией о файлах.

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