如何在oracle里以binary的ftp方式传送文件

| 1 Comment

上周五写了一段java存储过程,用于在oracle里实现zip压缩。

今天同事又来找我了,说调我写的zip压缩生成的zip文件在客户端无法解压缩。

 

这是因为默认的ftp方式是ascii

 

恩,那我们就来写一个以binaryftp方式传文件的存储过程。

P_SYS_PUT_BIN_FILE_BY_FTP 用于将在database server端的某个文件通过ftpbinary的方式传到指定的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端的某个文件通过ftpbinary的方式传到指定的ftp server

作者: cuihua

创建日期:2009-11-09

 

输入参数:

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 serversessionhandle

 

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端!

 

1 Comment

Problem solved.Thanks.

Leave a comment