如何在PL/SQL中将两个CSV文件合并打包为单个ZIP文件?
解决思路与代码修改方案
嘿,我仔细看了你的PL/SQL代码,问题很清楚:你现在是处理完单个CSV就立刻调用finish_zip生成独立ZIP,还发了两封单独的邮件。要把两个CSV打包到同一个ZIP里,其实只要调整一下操作顺序就行,核心逻辑是先把所有需要压缩的文件都添加到同一个ZIP对象中,最后只执行一次打包和邮件发送。
具体修改步骤
- 先初始化
ziplob,全程复用这个实例,不要中途置空 - 依次处理两个CSV文件,分别调用
as_zip.add1file把它们加入同一个ZIP对象 - 等两个文件都添加完成后,再调用
as_zip.finish_zip完成ZIP的打包 - 最后只发送一次邮件,附件就是包含两个CSV的ZIP文件
修改后的完整代码
create or replace PACKAGE BODY BE2010_SCHEDULE IS PROCEDURE job_morning IS BEGIN PROCEDURE job_msat IS rmt_dir VARCHAR2(200) ; filename VARCHAR2(200) ; country VARCHAR2(20) ; stamp_fmt VARCHAR2(30) := 'YYYYMMDDHH24MISS'; sep char := ';'; sw_header char := 'N'; tmp_nclob nclob; ziplob blob; v_destin varchar2(100) ; BEGIN XLOG.LOG_info('BE2010_SCHEDULE.JOB_MSAT_IN','BE2010: Starting the MSAT exports'); rmt_dir:= '/ForMarsh/Drive_T'; country := 'BE'; Select mprop_value into v_destin from marsh_env_properties where mprop_name = 'mailto.whole_team'; -- 初始化ZIP对象,全程复用这个实例 ziplob := null; -- 处理第一个CSV并加入ZIP filename := 'OSBELER_POL.CSV'; tmp_nclob := be2010_msat_leasing.xtr_policies (sep, sw_header); marshsat_ftp.send_NCLOB(tmp_nclob,'', rmt_dir ,filename,'UTF8'); as_zip.add1file( ziplob, filename, smtp.translate_nclob ( tmp_nclob,'UTF8' ) ); dbms_lob.freetemporary (tmp_nclob); -- 处理第二个CSV并加入同一个ZIP filename := 'OSBERCI_POL.CSV'; tmp_nclob := be2010_msat_rci.xtr_policies (sep, sw_header); marshsat_ftp.send_NCLOB(tmp_nclob,'', rmt_dir ,filename,'UTF8'); as_zip.add1file( ziplob, filename, smtp.translate_nclob ( tmp_nclob,'UTF8' ) ); dbms_lob.freetemporary (tmp_nclob); -- 完成ZIP打包(只执行一次) as_zip.finish_zip( ziplob ); -- 发送包含两个文件的ZIP邮件,标题和附件名调整得更清晰 smtp.send_mail ( v_destin, '[Cleva->MSAT] BE2010 - Leasing & RCI Combined', 'BE2010_Combined_Policies.zip', 'BE2010_Combined_Policies.zip', ziplob ) ; -- 清理资源 ziplob := null; END job_msat; END job_morning; END BE2010_SCHEDULE;
关键注意点
- 移除了原来两次
finish_zip和两次邮件发送的逻辑,避免生成多个独立ZIP - 全程保持
ziplob是同一个实例,不要在添加完第一个文件后就置空它 - 我把邮件标题和附件名改成了更明确的名称,方便接收方一眼知道这是合并后的打包文件
- 确认
as_zip.add1file支持多次添加文件到同一个BLOB对象——从你的代码用法来看,这个API设计就是用来累积添加文件到ZIP流的,所以完全没问题
内容的提问来源于stack exchange,提问作者Sam Parker
相关产品推荐
相关产品推荐

