设为首页 收藏本站
查看: 973|回复: 0

pl/sql中ftp处理(转)

[复制链接]
YunVN网友  发表于 2015-5-27 10:51:38 |阅读模式
  CREATE OR REPLACE PACKAGE ftp AS
  -- --------------------------------------------------------------------------
  -- Name         : http://www.oracle-base.com/dba/miscellaneous/ftp.pks
  -- Author       : DR Timothy S Hall
  -- Description  : Basic FTP API. For usage notes see:
  --                  http://www.oracle-base.com/articles/9i/FTPFromPLSQL9i.php
  -- Requirements : UTL_TCP
  -- Ammedments   :
  --   When         Who       What
  --   ===========  ========  =================================================
  --   14-AUG-2003  Tim Hall  Initial Creation
  --   10-MAR-2004  Tim Hall  Add convert_crlf procedure.
  --                          Make get_passive function visible.
  --                          Added get_direct and put_direct procedures.
  --   03-OCT-2006  Tim Hall  Add list, rename, delete, mkdir, rmdir procedures.
  -- --------------------------------------------------------------------------

    TYPE t_string_table IS TABLE OF VARCHAR2(32767);
    FUNCTION login(p_host IN VARCHAR2,
                 p_port IN VARCHAR2,
                 p_user IN VARCHAR2,
                 p_pass IN VARCHAR2) RETURN UTL_TCP.connection;

    FUNCTION get_passive(p_conn IN OUT NOCOPY UTL_TCP.connection)
    RETURN UTL_TCP.connection;

    PROCEDURE logout(p_conn  IN OUT NOCOPY UTL_TCP.connection,
                   p_reply IN BOOLEAN := TRUE);

    PROCEDURE send_command(p_conn    IN OUT NOCOPY UTL_TCP.connection,
                         p_command IN VARCHAR2,
                         p_reply   IN BOOLEAN := TRUE);

    FUNCTION get_local_ascii_data(p_dir IN VARCHAR2, p_file IN VARCHAR2)
    RETURN CLOB;

    FUNCTION get_local_binary_data(p_dir IN VARCHAR2, p_file IN VARCHAR2)
    RETURN BLOB;

    FUNCTION get_remote_ascii_data(p_conn IN OUT NOCOPY UTL_TCP.connection,
                                 p_file IN VARCHAR2) RETURN CLOB;

    FUNCTION get_remote_binary_data(p_conn IN OUT NOCOPY UTL_TCP.connection,
                                  p_file IN VARCHAR2) RETURN BLOB;

    PROCEDURE put_local_ascii_data(p_data IN CLOB,
                                 p_dir  IN VARCHAR2,
                                 p_file IN VARCHAR2);

    PROCEDURE put_local_binary_data(p_data IN BLOB,
                                  p_dir  IN VARCHAR2,
                                  p_file IN VARCHAR2);

    PROCEDURE put_remote_ascii_data(p_conn IN OUT NOCOPY UTL_TCP.connection,
                                  p_file IN VARCHAR2,
                                  p_data IN CLOB);

    PROCEDURE put_remote_binary_data(p_conn IN OUT NOCOPY UTL_TCP.connection,
                                   p_file IN VARCHAR2,
                                   p_data IN BLOB);

    PROCEDURE get(p_conn      IN OUT NOCOPY UTL_TCP.connection,
                p_from_file IN VARCHAR2,
                p_to_dir    IN VARCHAR2,
                p_to_file   IN VARCHAR2);

    PROCEDURE put(p_conn      IN OUT NOCOPY UTL_TCP.connection,
                p_from_dir  IN VARCHAR2,
                p_from_file IN VARCHAR2,
                p_to_file   IN VARCHAR2);

    PROCEDURE get_direct(p_conn      IN OUT NOCOPY UTL_TCP.connection,
                       p_from_file IN VARCHAR2,
                       p_to_dir    IN VARCHAR2,
                       p_to_file   IN VARCHAR2);

    PROCEDURE put_direct(p_conn      IN OUT NOCOPY UTL_TCP.connection,
                       p_from_dir  IN VARCHAR2,
                       p_from_file IN VARCHAR2,
                       p_to_file   IN VARCHAR2);

    PROCEDURE help(p_conn IN OUT NOCOPY UTL_TCP.connection);
    PROCEDURE ascii(p_conn IN OUT NOCOPY UTL_TCP.connection);
    PROCEDURE binary(p_conn IN OUT NOCOPY UTL_TCP.connection);
    PROCEDURE list(p_conn IN OUT NOCOPY UTL_TCP.connection,
                 p_dir  IN VARCHAR2,
                 p_list OUT t_string_table);

    PROCEDURE rename(p_conn IN OUT NOCOPY UTL_TCP.connection,
                   p_from IN VARCHAR2,
                   p_to   IN VARCHAR2);

    PROCEDURE delete(p_conn IN OUT NOCOPY UTL_TCP.connection,
                   p_file IN VARCHAR2);

    PROCEDURE mkdir(p_conn IN OUT NOCOPY UTL_TCP.connection,
                  p_dir  IN VARCHAR2);

    PROCEDURE rmdir(p_conn IN OUT NOCOPY UTL_TCP.connection,
                  p_dir  IN VARCHAR2);

    PROCEDURE convert_crlf(p_status IN BOOLEAN);
  END ftp;



  CREATE OR REPLACE PACKAGE BODY ftp AS
  -- --------------------------------------------------------------------------
  -- Name         : http://www.oracle-base.com/dba/miscellaneous/ftp.pkb
  -- Author       : DR Timothy S Hall
  -- Description  : Basic FTP API. For usage notes see:
  --                  http://www.oracle-base.com/articles/9i/FTPFromPLSQL9i.php
  -- Requirements : http://www.oracle-base.com/dba/miscellaneous/ftp.pks
  -- Ammedments   :
  --   When         Who       What
  --   ===========  ========  =================================================
  --   14-AUG-2003  Tim Hall  Initial Creation
  --   10-MAR-2004  Tim Hall  Add convert_crlf procedure.
  --                          Incorporate CRLF conversion functionality into
  --                          put_local_ascii_data and put_remote_ascii_data
  --                          functions.
  --                          Make get_passive function visible.
  --                          Added get_direct and put_direct procedures.
  --   23-DEC-2004  Tim Hall  The get_reply procedure was altered to deal with
  --                          banners starting with 4 white spaces. This fix is
  --                          a small variation on the resolution provided by
  --                          Gary Mason who spotted the bug.
  --   10-NOV-2005  Tim Hall  Addition of get_reply after doing a transfer to
  --                          pickup the 226 Transfer complete message. This
  --                          allows gets and puts with a single connection.
  --                          Issue spotted by Trevor Woolnough.
  --   03-OCT-2006  Tim Hall  Add list, rename, delete, mkdir, rmdir procedures.
  --   12-JAN-2007  Tim Hall  A call to get_reply was added to the get_remote%
  --                          procedures to allow multiple transfers per connection.
  -- --------------------------------------------------------------------------

    g_reply        t_string_table := t_string_table();
  g_binary       BOOLEAN := TRUE;
  g_debug        BOOLEAN := TRUE;
  g_convert_crlf BOOLEAN := TRUE;

    PROCEDURE get_reply(p_conn IN OUT NOCOPY UTL_TCP.connection);
    PROCEDURE debug(p_text IN VARCHAR2);
    -- --------------------------------------------------------------------------
  FUNCTION login(p_host IN VARCHAR2,
                 p_port IN VARCHAR2,
                 p_user IN VARCHAR2,
                 p_pass IN VARCHAR2) RETURN UTL_TCP.connection IS
    -- --------------------------------------------------------------------------
    l_conn UTL_TCP.connection;
  BEGIN
    g_reply.delete;
  
    l_conn := UTL_TCP.open_connection(p_host, p_port);
    get_reply(l_conn);
    send_command(l_conn, 'USER ' || p_user);
    send_command(l_conn, 'PASS ' || p_pass);
    RETURN l_conn;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  FUNCTION get_passive(p_conn IN OUT NOCOPY UTL_TCP.connection)
    RETURN UTL_TCP.connection IS
    -- --------------------------------------------------------------------------
    l_conn  UTL_TCP.connection;
    l_reply VARCHAR2(32767);
    l_host  VARCHAR(100);
    l_port1 NUMBER(10);
    l_port2 NUMBER(10);
  BEGIN
    send_command(p_conn, 'PASV');
    l_reply := g_reply(g_reply.last);
  
    l_reply := REPLACE(SUBSTR(l_reply,
                              INSTR(l_reply, '(') + 1,
                              (INSTR(l_reply, ')')) - (INSTR(l_reply, '(')) - 1),
                       ',',
                       '.');
    l_host  := SUBSTR(l_reply, 1, INSTR(l_reply, '.', 1, 4) - 1);
  
    l_port1 := TO_NUMBER(SUBSTR(l_reply,
                                INSTR(l_reply, '.', 1, 4) + 1,
                                (INSTR(l_reply, '.', 1, 5) - 1) -
                                (INSTR(l_reply, '.', 1, 4))));
    l_port2 := TO_NUMBER(SUBSTR(l_reply, INSTR(l_reply, '.', 1, 5) + 1));
  
    l_conn := utl_tcp.open_connection(l_host, 256 * l_port1 + l_port2);
    return l_conn;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE logout(p_conn  IN OUT NOCOPY UTL_TCP.connection,
                   p_reply IN BOOLEAN := TRUE) AS
    -- --------------------------------------------------------------------------
  BEGIN
    send_command(p_conn, 'QUIT', p_reply);
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE send_command(p_conn    IN OUT NOCOPY UTL_TCP.connection,
                         p_command IN VARCHAR2,
                         p_reply   IN BOOLEAN := TRUE) IS
    -- --------------------------------------------------------------------------
    l_result PLS_INTEGER;
  BEGIN
    l_result := UTL_TCP.write_line(p_conn, p_command);
  
    IF p_reply THEN
      get_reply(p_conn);
    END IF;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE get_reply(p_conn IN OUT NOCOPY UTL_TCP.connection) IS
    -- --------------------------------------------------------------------------
    l_reply_code VARCHAR2(3) := NULL;
  BEGIN
    LOOP
      g_reply.extend;
      g_reply(g_reply.last) := UTL_TCP.get_line(p_conn, TRUE);
      debug(g_reply(g_reply.last));
      IF l_reply_code IS NULL THEN
        l_reply_code := SUBSTR(g_reply(g_reply.last), 1, 3);
      END IF;
      IF SUBSTR(l_reply_code, 1, 1) = '5' THEN
        RAISE_APPLICATION_ERROR(-20000, g_reply(g_reply.last));
      ELSIF (SUBSTR(g_reply(g_reply.last), 1, 3) = l_reply_code AND
            SUBSTR(g_reply(g_reply.last), 4, 1) = ' ') THEN
        EXIT;
      END IF;
    END LOOP;
  EXCEPTION
    WHEN UTL_TCP.END_OF_INPUT THEN
      NULL;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  FUNCTION get_local_ascii_data(p_dir IN VARCHAR2, p_file IN VARCHAR2)
    RETURN CLOB IS
    -- --------------------------------------------------------------------------
    l_bfile BFILE;
    l_data  CLOB;
  BEGIN
    DBMS_LOB.createtemporary(lob_loc => l_data,
                             cache   => TRUE,
                             dur     => DBMS_LOB.call);
  
    l_bfile := BFILENAME(p_dir, p_file);
    DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);
    DBMS_LOB.loadfromfile(l_data, l_bfile, DBMS_LOB.getlength(l_bfile));
    DBMS_LOB.fileclose(l_bfile);
  
    RETURN l_data;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  FUNCTION get_local_binary_data(p_dir IN VARCHAR2, p_file IN VARCHAR2)
    RETURN BLOB IS
    -- --------------------------------------------------------------------------
    l_bfile BFILE;
    l_data  BLOB;
  BEGIN
    DBMS_LOB.createtemporary(lob_loc => l_data,
                             cache   => TRUE,
                             dur     => DBMS_LOB.call);
  
    l_bfile := BFILENAME(p_dir, p_file);
    DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);
    DBMS_LOB.loadfromfile(l_data, l_bfile, DBMS_LOB.getlength(l_bfile));
    DBMS_LOB.fileclose(l_bfile);
  
    RETURN l_data;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  FUNCTION get_remote_ascii_data(p_conn IN OUT NOCOPY UTL_TCP.connection,
                                 p_file IN VARCHAR2) RETURN CLOB IS
    -- --------------------------------------------------------------------------
    l_conn   UTL_TCP.connection;
    l_amount PLS_INTEGER;
    l_buffer VARCHAR2(32767);
    l_data   CLOB;
  BEGIN
    DBMS_LOB.createtemporary(lob_loc => l_data,
                             cache   => TRUE,
                             dur     => DBMS_LOB.call);
  
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'RETR ' || p_file, TRUE);
    logout(l_conn, FALSE);
  
    BEGIN
      LOOP
        l_amount := UTL_TCP.read_text(l_conn, l_buffer, 32767);
        DBMS_LOB.writeappend(l_data, l_amount, l_buffer);
      END LOOP;
    EXCEPTION
      WHEN UTL_TCP.END_OF_INPUT THEN
        NULL;
      WHEN OTHERS THEN
        NULL;
    END;
    get_reply(p_conn);
    UTL_TCP.close_connection(l_conn);
  
    RETURN l_data;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  FUNCTION get_remote_binary_data(p_conn IN OUT NOCOPY UTL_TCP.connection,
                                  p_file IN VARCHAR2) RETURN BLOB IS
    -- --------------------------------------------------------------------------
    l_conn   UTL_TCP.connection;
    l_amount PLS_INTEGER;
    l_buffer RAW(32767);
    l_data   BLOB;
  BEGIN
    DBMS_LOB.createtemporary(lob_loc => l_data,
                             cache   => TRUE,
                             dur     => DBMS_LOB.call);
  
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'RETR ' || p_file, TRUE);
  
    BEGIN
      LOOP
        l_amount := UTL_TCP.read_raw(l_conn, l_buffer, 32767);
        DBMS_LOB.writeappend(l_data, l_amount, l_buffer);
      END LOOP;
    EXCEPTION
      WHEN UTL_TCP.END_OF_INPUT THEN
        NULL;
      WHEN OTHERS THEN
        NULL;
    END;
    get_reply(p_conn);
    UTL_TCP.close_connection(l_conn);
  
    RETURN l_data;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE put_local_ascii_data(p_data IN CLOB,
                                 p_dir  IN VARCHAR2,
                                 p_file IN VARCHAR2) IS
    -- --------------------------------------------------------------------------
    l_out_file UTL_FILE.file_type;
    l_buffer   VARCHAR2(32767);
    l_amount   BINARY_INTEGER := 32767;
    l_pos      INTEGER := 1;
    l_clob_len INTEGER;
  BEGIN
    l_clob_len := DBMS_LOB.getlength(p_data);
  
    l_out_file := UTL_FILE.fopen(p_dir, p_file, 'w', 32767);
  
    WHILE l_pos < l_clob_len LOOP
      DBMS_LOB.read(p_data, l_amount, l_pos, l_buffer);
      IF g_convert_crlf THEN
        l_buffer := REPLACE(l_buffer, CHR(13), NULL);
      END IF;
   
      UTL_FILE.put(l_out_file, l_buffer);
      UTL_FILE.fflush(l_out_file);
      l_pos := l_pos + l_amount;
    END LOOP;
  
    UTL_FILE.fclose(l_out_file);
  EXCEPTION
    WHEN OTHERS THEN
      IF UTL_FILE.is_open(l_out_file) THEN
        UTL_FILE.fclose(l_out_file);
      END IF;
      RAISE;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE put_local_binary_data(p_data IN BLOB,
                                  p_dir  IN VARCHAR2,
                                  p_file IN VARCHAR2) IS
    -- --------------------------------------------------------------------------
    l_out_file UTL_FILE.file_type;
    l_buffer   RAW(32767);
    l_amount   BINARY_INTEGER := 32767;
    l_pos      INTEGER := 1;
    l_blob_len INTEGER;
  BEGIN
    l_blob_len := DBMS_LOB.getlength(p_data);
  
    l_out_file := UTL_FILE.fopen(p_dir, p_file, 'w', 32767);
  
    WHILE l_pos < l_blob_len LOOP
      DBMS_LOB.read(p_data, l_amount, l_pos, l_buffer);
      UTL_FILE.put_raw(l_out_file, l_buffer, TRUE);
      UTL_FILE.fflush(l_out_file);
      l_pos := l_pos + l_amount;
    END LOOP;
  
    UTL_FILE.fclose(l_out_file);
  EXCEPTION
    WHEN OTHERS THEN
      IF UTL_FILE.is_open(l_out_file) THEN
        UTL_FILE.fclose(l_out_file);
      END IF;
      RAISE;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE put_remote_ascii_data(p_conn IN OUT NOCOPY UTL_TCP.connection,
                                  p_file IN VARCHAR2,
                                  p_data IN CLOB) IS
    -- --------------------------------------------------------------------------
    l_conn     UTL_TCP.connection;
    l_result   PLS_INTEGER;
    l_buffer   VARCHAR2(32767);
    l_amount   BINARY_INTEGER := 32767;
    l_pos      INTEGER := 1;
    l_clob_len INTEGER;
  BEGIN
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'STOR ' || p_file, TRUE);
  
    l_clob_len := DBMS_LOB.getlength(p_data);
  
    WHILE l_pos < l_clob_len LOOP
      DBMS_LOB.READ(p_data, l_amount, l_pos, l_buffer);
      IF g_convert_crlf THEN
        l_buffer := REPLACE(l_buffer, CHR(13), NULL);
      END IF;
      l_result := UTL_TCP.write_text(l_conn, l_buffer, LENGTH(l_buffer));
      UTL_TCP.flush(l_conn);
      l_pos := l_pos + l_amount;
    END LOOP;
    UTL_TCP.close_connection(l_conn);
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE put_remote_binary_data(p_conn IN OUT NOCOPY UTL_TCP.connection,
                                   p_file IN VARCHAR2,
                                   p_data IN BLOB) IS
    -- --------------------------------------------------------------------------
    l_conn     UTL_TCP.connection;
    l_result   PLS_INTEGER;
    l_buffer   RAW(32767);
    l_amount   BINARY_INTEGER := 32767;
    l_pos      INTEGER := 1;
    l_blob_len INTEGER;
  BEGIN
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'STOR ' || p_file, TRUE);
  
    l_blob_len := DBMS_LOB.getlength(p_data);
  
    WHILE l_pos < l_blob_len LOOP
      DBMS_LOB.READ(p_data, l_amount, l_pos, l_buffer);
      l_result := UTL_TCP.write_raw(l_conn, l_buffer, l_amount);
      UTL_TCP.flush(l_conn);
      l_pos := l_pos + l_amount;
    END LOOP;
    UTL_TCP.close_connection(l_conn);
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE get(p_conn      IN OUT NOCOPY UTL_TCP.connection,
                p_from_file IN VARCHAR2,
                p_to_dir    IN VARCHAR2,
                p_to_file   IN VARCHAR2) AS
    -- --------------------------------------------------------------------------
  BEGIN
    IF g_binary THEN
      put_local_binary_data(p_data => get_remote_binary_data(p_conn,
                                                             p_from_file),
                            p_dir  => p_to_dir,
                            p_file => p_to_file);
    ELSE
      put_local_ascii_data(p_data => get_remote_ascii_data(p_conn,
                                                           p_from_file),
                           p_dir  => p_to_dir,
                           p_file => p_to_file);
    END IF;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE put(p_conn      IN OUT NOCOPY UTL_TCP.connection,
                p_from_dir  IN VARCHAR2,
                p_from_file IN VARCHAR2,
                p_to_file   IN VARCHAR2) AS
    -- --------------------------------------------------------------------------
  BEGIN
    IF g_binary THEN
      put_remote_binary_data(p_conn => p_conn,
                             p_file => p_to_file,
                             p_data => get_local_binary_data(p_from_dir,
                                                             p_from_file));
    ELSE
      put_remote_ascii_data(p_conn => p_conn,
                            p_file => p_to_file,
                            p_data => get_local_ascii_data(p_from_dir,
                                                           p_from_file));
    END IF;
    get_reply(p_conn);
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE get_direct(p_conn      IN OUT NOCOPY UTL_TCP.connection,
                       p_from_file IN VARCHAR2,
                       p_to_dir    IN VARCHAR2,
                       p_to_file   IN VARCHAR2) IS
    -- --------------------------------------------------------------------------
    l_conn       UTL_TCP.connection;
    l_out_file   UTL_FILE.file_type;
    l_amount     PLS_INTEGER;
    l_buffer     VARCHAR2(32767);
    l_raw_buffer RAW(32767);
  BEGIN
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'RETR ' || p_from_file, TRUE);
    l_out_file := UTL_FILE.fopen(p_to_dir, p_to_file, 'w', 32767);
  
    BEGIN
      LOOP
        IF g_binary THEN
          l_amount := UTL_TCP.read_raw(l_conn, l_raw_buffer, 32767);
          UTL_FILE.put_raw(l_out_file, l_raw_buffer, TRUE);
        ELSE
          l_amount := UTL_TCP.read_text(l_conn, l_buffer, 32767);
          IF g_convert_crlf THEN
            l_buffer := REPLACE(l_buffer, CHR(13), NULL);
          END IF;
          UTL_FILE.put(l_out_file, l_buffer);
        END IF;
        UTL_FILE.fflush(l_out_file);
      END LOOP;
    EXCEPTION
      WHEN UTL_TCP.END_OF_INPUT THEN
        NULL;
      WHEN OTHERS THEN
        NULL;
    END;
    UTL_FILE.fclose(l_out_file);
    UTL_TCP.close_connection(l_conn);
  EXCEPTION
    WHEN OTHERS THEN
      IF UTL_FILE.is_open(l_out_file) THEN
        UTL_FILE.fclose(l_out_file);
      END IF;
      RAISE;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE put_direct(p_conn      IN OUT NOCOPY UTL_TCP.connection,
                       p_from_dir  IN VARCHAR2,
                       p_from_file IN VARCHAR2,
                       p_to_file   IN VARCHAR2) IS
    -- --------------------------------------------------------------------------
    l_conn       UTL_TCP.connection;
    l_bfile      BFILE;
    l_result     PLS_INTEGER;
    l_amount     PLS_INTEGER := 32767;
    l_raw_buffer RAW(32767);
    l_len        NUMBER;
    l_pos        NUMBER := 1;
    ex_ascii EXCEPTION;
  BEGIN
    IF NOT g_binary THEN
      RAISE ex_ascii;
    END IF;
  
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'STOR ' || p_to_file, TRUE);
  
    l_bfile := BFILENAME(p_from_dir, p_from_file);
  
    DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);
    l_len := DBMS_LOB.getlength(l_bfile);
  
    WHILE l_pos < l_len LOOP
      DBMS_LOB.READ(l_bfile, l_amount, l_pos, l_raw_buffer);
      debug(l_amount);
      l_result := UTL_TCP.write_raw(l_conn, l_raw_buffer, l_amount);
      l_pos    := l_pos + l_amount;
    END LOOP;
  
    DBMS_LOB.fileclose(l_bfile);
    UTL_TCP.close_connection(l_conn);
  EXCEPTION
    WHEN ex_ascii THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'PUT_DIRECT not available in ASCII mode.');
    WHEN OTHERS THEN
      IF DBMS_LOB.fileisopen(l_bfile) = 1 THEN
        DBMS_LOB.fileclose(l_bfile);
      END IF;
      RAISE;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE help(p_conn IN OUT NOCOPY UTL_TCP.connection) AS
    -- --------------------------------------------------------------------------
  BEGIN
    send_command(p_conn, 'HELP', TRUE);
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE ascii(p_conn IN OUT NOCOPY UTL_TCP.connection) AS
    -- --------------------------------------------------------------------------
  BEGIN
    send_command(p_conn, 'TYPE A', TRUE);
    g_binary := FALSE;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE binary(p_conn IN OUT NOCOPY UTL_TCP.connection) AS
    -- --------------------------------------------------------------------------
  BEGIN
    send_command(p_conn, 'TYPE I', TRUE);
    g_binary := TRUE;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE list(p_conn IN OUT NOCOPY UTL_TCP.connection,
                 p_dir  IN VARCHAR2,
                 p_list OUT t_string_table) AS
    -- --------------------------------------------------------------------------
    l_conn       UTL_TCP.connection;
    l_list       t_string_table := t_string_table();
    l_reply_code VARCHAR2(3) := NULL;
  BEGIN
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'LIST ' || p_dir, TRUE);
  
    BEGIN
      LOOP
        l_list.extend;
        l_list(l_list.last) := UTL_TCP.get_line(l_conn, TRUE);
        debug(l_list(l_list.last));
        IF l_reply_code IS NULL THEN
          l_reply_code := SUBSTR(l_list(l_list.last), 1, 3);
        END IF;
        IF SUBSTR(l_reply_code, 1, 1) = '5' THEN
          RAISE_APPLICATION_ERROR(-20000, l_list(l_list.last));
        ELSIF (SUBSTR(g_reply(g_reply.last), 1, 3) = l_reply_code AND
              SUBSTR(g_reply(g_reply.last), 4, 1) = ' ') THEN
          EXIT;
        END IF;
      END LOOP;
    EXCEPTION
      WHEN UTL_TCP.END_OF_INPUT THEN
        NULL;
    END;
  
    l_list.delete(l_list.last);
    p_list := l_list;
  END list;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE rename(p_conn IN OUT NOCOPY UTL_TCP.connection,
                   p_from IN VARCHAR2,
                   p_to   IN VARCHAR2) AS
    -- --------------------------------------------------------------------------
    l_conn UTL_TCP.connection;
  BEGIN
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'RNFR ' || p_from, TRUE);
    send_command(p_conn, 'RNTO ' || p_to, TRUE);
    logout(l_conn, FALSE);
  END rename;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE delete(p_conn IN OUT NOCOPY UTL_TCP.connection,
                   p_file IN VARCHAR2) AS
    -- --------------------------------------------------------------------------
    l_conn UTL_TCP.connection;
  BEGIN
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'DELE ' || p_file, TRUE);
    logout(l_conn, FALSE);
  END delete;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE mkdir(p_conn IN OUT NOCOPY UTL_TCP.connection,
                  p_dir  IN VARCHAR2) AS
    -- --------------------------------------------------------------------------
    l_conn UTL_TCP.connection;
  BEGIN
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'MKD ' || p_dir, TRUE);
    logout(l_conn, FALSE);
  END mkdir;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE rmdir(p_conn IN OUT NOCOPY UTL_TCP.connection,
                  p_dir  IN VARCHAR2) AS
    -- --------------------------------------------------------------------------
    l_conn UTL_TCP.connection;
  BEGIN
    l_conn := get_passive(p_conn);
    send_command(p_conn, 'RMD ' || p_dir, TRUE);
    logout(l_conn, FALSE);
  END rmdir;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE convert_crlf(p_status IN BOOLEAN) AS
    -- --------------------------------------------------------------------------
  BEGIN
    g_convert_crlf := p_status;
  END;
  -- --------------------------------------------------------------------------

    -- --------------------------------------------------------------------------
  PROCEDURE debug(p_text IN VARCHAR2) IS
    -- --------------------------------------------------------------------------
  BEGIN
    IF g_debug THEN
      DBMS_OUTPUT.put_line(SUBSTR(p_text, 1, 255));
    END IF;
  END;
  -- --------------------------------------------------------------------------

  END ftp;

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-71173-1-1.html 上篇帖子: 设置Serv-U FTP 支持被动模式连接 ,530错误等解决办法 下篇帖子: FlashFXP(强大的FXP/ftp上传工具)V5.0.0.3722简体中文特别版
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表