上周五写了一段java存储过程,用于在oracle里实现zip压缩。
今天同事又来找我了,说调我写的zip压缩生成的zip文件在客户端无法解压缩。
这是因为默认的ftp方式是ascii。
恩,那我们就来写一个以binary的ftp方式传文件的存储过程。
P_SYS_PUT_BIN_FILE_BY_FTP 用于将在database server端的某个文件通过ftp以binary的方式传到指定的ftp server端。
其代码如下:
create or replace procedure P_SYS_PUT_BIN_FILE_BY_FTP
(i_vc_filepath in varchar2,
i_vc_filename in varchar2,
i_vc_ftpserver_ip_address in varchar2,
i_vc_ftpserver_username in varchar2,
i_vc_ftpserver_password in varchar2,
o_vc_return_flag out varchar2) is
/*
功能: 将在database server端的某个文件通过ftp以binary的方式传到指定的ftp server端
作者: cuihua
创建日期:
输入参数:
i_vc_filepath:待传的文件所在的路径,注意这里的路径只能是已经建好的directory的名字
i_vc_filename: 待传的文件名
i_vc_ftpserver_ip_address: 待传送文件的ftp server端的ip地址
i_vc_ftpserver_username: 连接该ftp server端的用户名
i_vc_ftpserver_password:连接该ftp server端用户的密码
输出参数:
o_vc_return_flag:用于判断该存储过程是否成功执行,并在出错后存储相应的错误原因。
如果它的值的第一位为S,则表明该存储过程成功执行,没有错误。
如果它的值的第一位为E,则表明该存储过程执行失败,具体错误原因为它的值的第二位到最后一位。
输入输出参数:
无
调用到的存储过程:
xutl_ftp.put
*/
styp_handle xutl_ftp.session_handle; --连接ftp server的session的handle
src_file BFILE;
dst_file BLOB;
lgh_file BINARY_INTEGER;
begin
o_vc_return_flag := 'S' || '_' || i_vc_filename || '已经成功上传到指定的ftp server端!';
dbms_lob.createtemporary(dst_file,false,dbms_lob.session);
src_file := bfilename(i_vc_filepath, i_vc_filename);
dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
lgh_file := dbms_lob.getlength(src_file);
dbms_lob.loadfromfile(dst_file, src_file, lgh_file);
styp_handle := xutl_ftp.start_session(i_vc_ftpserver_ip_address, i_vc_ftpserver_username, i_vc_ftpserver_password);
xutl_ftp.put(styp_handle, dst_file, i_vc_filename);
xutl_ftp.end_session(styp_handle);
dbms_lob.fileclose(src_file);
if dbms_lob.istemporary(dst_file) = 1 then
dbms_lob.freetemporary(dst_file);
end if;
commit;
exception
when others then
o_vc_return_flag := 'E' || '_' || sqlcode || '_' || sqlerrm;
rollback;
return;
end P_SYS_PUT_BIN_FILE_BY_FTP;
我们来看一下上述存储过程如何用:
SQL> set serveroutput on size 1000000;
SQL> var vc_return_flag varchar2(2000);
SQL> exec p_sys_put_bin_file_by_ftp('INTERFACE_FILE_DIR','SAT.CA.20090918.00000050.IN.zip','172.22.9.134','cuihua','cuihua',
:vc_return_flag);
PL/SQL procedure successfully completed
vc_return_flag
---------
S_SAT.CA.20090918.00000050.IN.zip已经成功上传到指定的ftp server端!
Problem solved.Thanks.