You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle APEX实现IR/IG报表勾选文件批量打包下载方案问询

Oracle APEX实现选中文件打包下载

我参考相关教程在Oracle APEX 22.2版本中实现了文件ZIP格式下载,该方案能正常运行,但仅支持全部文件打包下载。我的需求是在交互式报表(IR)或交互式网格(IG)中添加复选框,实现仅下载选中文件为单个ZIP包。

使用的表结构

表结构来自Oracle APEX文件上传下载示例:

select
    ID,
    ROW_VERSION_NUMBER,
    PROJECT_ID,
    FILENAME,
    FILE_MIMETYPE,
    FILE_CHARSET,
    FILE_BLOB,
    FILE_COMMENTS,
    TAGS,
    CREATED,
    CREATED_BY,
    UPDATED,
    UPDATED_BY
from EBA_DEMO_FILES

我曾在网上搜索,找到一些关于APEX_ZIP、PL/SQL压缩Blob的内容,但未找到可直接运行的同类示例或教程。

解决方案更新

根据Koen Lostrie的建议,我更新了页面处理代码和查询语句,已实现需求:

页面处理代码

DECLARE
  l_id_arr apex_t_varchar2;
  l_selected_id_arr apex_t_varchar2;
  var_zip blob;
BEGIN
  -- 将所有ID值存入数组
  FOR i IN 1..APEX_APPLICATION.G_F03.COUNT LOOP
    apex_string.push(l_id_arr,APEX_APPLICATION.G_F03(i));
    FOR j IN 1 .. APEX_APPLICATION.G_F01.COUNT LOOP
      IF APEX_APPLICATION.G_F01(j) = APEX_APPLICATION.G_F03(i) THEN
       -- 将选中的ID存入第二个数组
       apex_string.push(l_selected_id_arr,APEX_APPLICATION.G_F03(i));
      END IF;
    END LOOP;
  END LOOP;
    -- 创建/清空ZIP集合
    APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(
        p_collection_name => 'ZIP');
    -- 遍历数据库中选中的文件
    begin
        for var_file in (select fi.filename, fi.file_blob, pr.project
                         from eba_demo_files fi
                         inner join eba_demo_file_projects pr on fi.project_id = pr.id
                         where fi.id in (SELECT column_value FROM table(apex_string.split(apex_string.join(l_selected_id_arr,':'),':'))))
        loop
            -- 将每个文件添加到ZIP包中
            APEX_ZIP.ADD_FILE (
                p_zipped_blob => var_zip,
                p_file_name   => var_file.project || '/' || var_file.filename,
                p_content     => var_file.file_blob );
        end loop;
    exception when no_data_found then
        -- 无文件时抛出错误
        raise_application_error(-20001, '未找到文件!');
    end;
    -- 完成ZIP文件创建
    APEX_ZIP.FINISH(
        p_zipped_blob => var_zip);
    -- 将ZIP文件添加到集合的Blob列中
    APEX_COLLECTION.ADD_MEMBER(
        p_collection_name => 'ZIP',
        p_blob001            => var_zip);
END;

页面处理代码完成后,需遵循原教程中的步骤3和4完成后续配置。

更新后的交互式报表查询语句

select
ID,
ROW_VERSION_NUMBER,
PROJECT_ID,
FILENAME,
FILE_MIMETYPE,
FILE_CHARSET,
FILE_BLOB,
FILE_COMMENTS,
TAGS,
CREATED,
CREATED_BY,
UPDATED,
UPDATED_BY,
APEX_ITEM.CHECKBOX(1,ID) checkbox,
APEX_ITEM.TEXT(2,FILENAME) some_text,
APEX_ITEM.HIDDEN(3,ID) hidden_empno
from EBA_DEMO_FILES

非常感谢Koen Lostrie,所有功劳归于他。

内容的提问来源于stack exchange,提问作者Richa Fernandes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:50:36