Excellent FTP Client within Oracle PL/SQL   June 22, 2007

 

We needed to transfer image file from our  Infrastructure application server to our middle tier server through PL/SQL procedure.

The following is PL/SQL script doing just that

You will need to

1) load the following package  into your schema

     
http://www.oracle-base.com/dba/miscellaneous/ftp.pks
http://www.oracle-base.com/dba/miscellaneous/ftp.pkb
credit goes to Tim Hall [oracle-base.com]

    

 2) Create an ORACLE directory reference point to your local drive

     CREATE OR REPLACE DIRECTORY my_docs AS  '/app/infra/portal/mosd'

 3)  Then write the following PL/SQL block

     -- Send a binary file to a remote FTP server.
DECLARE
  l_conn  UTL_TCP.connection;
BEGIN
  l_conn := ftp.login('mid.realsoft.com', '21', 'ammar', 'sajdi');
  ftp.binary(p_conn => l_conn);
  ftp.put(p_conn      => l_conn,
          p_from_dir  => 'MY_DOCS',
          p_from_file => 'filename.gif',
          p_to_file   => 'filename.gif');
  ftp.logout(l_conn);
  utl_tcp.close_all_connections;
END;

 

Our actually example is a bit more elaborate.

We have a record in the database for each image file.  because, we initially upload images to the database and store some database about the image including filename etc ..

For our example to work, we need to read the filename form the database and initiate an FTP put request. ie

 

Create or replace procedure put_images is

cursor c1 select * from image_Files where  sysdate < expireydate;

  REC1 c1%notfound;

  l_conn  UTL_TCP.connection;

begin

open c1;

loop

     fetch c1 into REC1;

    exit when C1%notfound;

   ftp.put(p_conn      => l_conn,
          p_from_dir  => 'MY_DOCS',
          p_from_file => 'rec1.filename',
          p_to_file   => 'rec1.filename');

 end loop;
 ftp.logout(l_conn);
 utl_tcp.close_all_connections;
end;


NOTE: if the remote server, you you want to transfer the files has an Oracle Instance running, then there is an easier way to accomplish this transfer using the DBMS_FILE_TRANSFER package that is demonstrated in previous tip