You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PL/SQL连接SFTP报ORA-29260 TNS连接关闭问题求助

错误原因
  • 核心原因:协议不匹配
    你代码中使用的ftp.login()是FTP协议专用的客户端API,仅支持传统FTP/FTPS协议交互,但你指定的连接端口是22,对应服务端运行的是SFTP服务。SFTP是SSH协议的子协议,和FTP协议没有任何关联,服务端收到FTP协议的握手请求后会直接主动断开连接,因此抛出ORA-29260: network error: TNS:connection closed错误。
    你之前排查的网络连通性、ACL、手动SFTP连接等均正常,已经排除了网络层面的问题,问题完全出在调用API和目标服务协议不匹配上。
解决方案

方案1:使用支持SFTP协议的PL/SQL工具包

Oracle原生未内置SFTP客户端API,你可以部署开源的PL/SQL SFTP封装包(基于UTL_TCP实现SSH协议握手和SFTP交互逻辑),替换现有FTP包的调用,示例调用逻辑参考:

DECLARE
  l_conn  sftp.connection;
BEGIN
  l_conn := sftp.login('xx.xx.xx.xx', 22, 'myuser', 'mypass');
  sftp.put(p_conn      => l_conn,
           p_from_dir  => 'MY_DOCS',
           p_from_file => 'test_get.txt',
           p_to_file   => '/app/test_put.txt');
  dbms_output.put_line('connection done');
  sftp.logout(l_conn);
END;
/

方案2:调用操作系统SFTP命令(更稳定)

你已经确认Oracle服务器操作系统层面可以正常调用sftp命令完成传输,可通过DBMS_SCHEDULER调度操作系统脚本来完成文件传输,不需要额外部署自定义PL/SQL包,兼容性和稳定性更高:

  1. 首先在服务器上编写sftp传输shell脚本,授予Oracle运行用户执行权限
  2. 通过DBMS_SCHEDULER.create_job创建外部可执行程序调度任务,触发执行即可

方案3:修正协议端口(如果误用端口)

如果你实际要连接的是FTP服务而非SFTP服务,直接将连接端口改为FTP服务的监听端口(默认21)即可正常连接。

内容的提问来源于stack exchange,提问作者Ibrahim Demirtas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:54:03