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包,兼容性和稳定性更高:
- 首先在服务器上编写sftp传输shell脚本,授予Oracle运行用户执行权限
- 通过
DBMS_SCHEDULER.create_job创建外部可执行程序调度任务,触发执行即可
方案3:修正协议端口(如果误用端口)
如果你实际要连接的是FTP服务而非SFTP服务,直接将连接端口改为FTP服务的监听端口(默认21)即可正常连接。
内容的提问来源于stack exchange,提问作者Ibrahim Demirtas
相关产品推荐
相关产品推荐

