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
相关产品推荐
相关产品推荐

