【问题标题】:How to read .csv file from FTP or SFTP server using Oracle PL SQL?如何使用 Oracle PL SQL 从 FTP 或 SFTP 服务器读取 .csv 文件?
【发布时间】:2018-03-19 10:44:41
【问题描述】:

我想使用 Oracle SQL 或 PL SQL 读取位于 FTP 或 SFTP 服务器上的 .csv 文件的数据。 我尝试了下面的代码,它显示了 SSH-2.0-OpenSSH_5.3 之类的输出,这意味着我希望已连接。

 declare
  c  utl_tcp.connection;  -- TCP/IP connection to the Web server
  ret_val pls_integer;
BEGIN
  c := utl_tcp.open_connection(remote_host => 'ftp.******.******.com'
                              ,remote_port =>  21
                              ,charset => 'US7ASCII'
--                              ,wallet_path     => '****************'
--                              ,wallet_password => '**********'
                              );  -- open connection
--  ret_val := utl_tcp.write_line(c, 'GET / HTTP/1.0');    -- send HTTP request
  ret_val := utl_tcp.write_line(c);
  BEGIN
    LOOP
      dbms_output.put_line(utl_tcp.get_line(c, TRUE));  -- read result
    END LOOP;
  EXCEPTION
    WHEN utl_tcp.end_of_input THEN
      NULL; -- end of input
  END;
  utl_tcp.close_connection(c);
END;
/

有人可以帮助我了解如何打开和读取 SFTP/FTP 服务器中存在的 .csv 文件并将其加载到 Oracle DB 表中吗?

【问题讨论】:

标签: sql oracle plsql


【解决方案1】:

Oracle-base.com 的 Tim Hall 正是这样做的,并在他的博客文章中提供了 ftp plsql API。

这是您要问的摘录。

  l_conn := ftp.login('ftp.company.com', '21', 'ftpuser', 'ftppassword');
  ftp.ascii(p_conn => l_conn);
  ftp.get(p_conn      => l_conn,
          p_from_file => '/u01/app/oracle/test.txt',
          p_to_dir    => 'MY_DOCS',
          p_to_file   => 'test_get.txt');
  ftp.logout(l_conn);
END;
/

这是完整的博客文章: https://oracle-base.com/articles/misc/ftp-from-plsql

【讨论】:

    【解决方案2】:

    您需要一些工具/应用程序来打开 FTP 或 SFTP 中存在的文件并将其中的数据加载到数据库中,有一些工具可用于将它们加载到数据库中,例如 Dollar Universe、Tidal 调度程序等。最多的 sql 和 pl/sql 代码。这些工具与需要手动触发的 unix/windows 操作系统相关联

    【讨论】:

      【解决方案3】:

      如果您需要 PL/SQL 中的 SFTP 客户端,可以查看来自 DidiSoft 的商业 OraSFTP 包。

      这是一个示例用法:

      DECLARE 
        connection_id NUMBER;
        private_key_handle BFILE;
        private_key BLOB;  
        PRIVATE_KEY_PASSWORD VARCHAR2(500);  
        downloaded_file BLOB;
      BEGIN
          DBMS_LOB.createtemporary(PRIVATE_KEY, TRUE);
          private_key_handle := BFILENAME('PGP_KEYS_DIR', 'test_putty_private.ppk'); -- directory name must be Upper case
          DBMS_LOB.OPEN(private_key_handle, DBMS_LOB.LOB_READONLY);
          DBMS_LOB.LoadFromFile( private_key, private_key_handle, DBMS_LOB.GETLENGTH(private_key_handle) );
          DBMS_LOB.CLOSE(private_key_handle);
          PRIVATE_KEY_PASSWORD := 'changeit';
       
          connection_id := ORA_SFTP.CONNECT_HOST('localhost', 22, 'nasko', private_key, private_key_password);
       
          downloaded_file := ORA_SFTP.DOWNLOAD(connection_id, 'remote_file.dat');
       
          ORA_SFTP.DISCONNECT_HOST(connection_id);
      END;
      /
      

      免责声明:我为滴滴软件工作

      【讨论】: