如何使用Oracle PL SQL从FTP或SFTP服务器读取.csv文件?

时间:2018-03-19 10:44:41

标签: sql oracle plsql

我想使用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表中吗?

3 个答案:

答案 0 :(得分:0)

您需要一些工具/应用程序来打开FTP或SFTP中存在的文件并将其中的数据加载到数据库中,有一些工具可用于将它们加载到数据库,如Dollar Universe,潮汐调度程序等。 sql和pl / sql代码。这些工具与需要手动触发的unix / windows OS链接

答案 1 :(得分:0)

<{3}}的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;
/

以下是完整的博文:    Oracle-base.com

答案 2 :(得分:0)

如果您需要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;
/

免责声明:我为DidiSoft工作