zoukankan      html  css  js  c++  java
  • pl/sql中ftp处理(转)

    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;


  • 相关阅读:
    【MySQL】:利用DCL管理用户和控制权限
    【MySQL】:事务四大特性与隔离级别
    JDBC概述及编程步骤详解
    【MySQL】:多表查询
    【MySQL】:MySQL中四大约束
    MySQL解决DOS窗口乱码问题
    【MySQL】:分组查询where和having
    【MySQL】:利用DQL查询表中的数据
    【MySQL】:利用DML操作表中数据
    【MySQL】:利用DDL操作数据库、表
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/993689.html
Copyright © 2011-2022 走看看