我目前正在处理一个副项目,需要我从远程FTP复制.csv文件并将其保存在本地。我想我会使用DBMS_SCHEDULER.GET_FILE
,但我没有得到许可。当我问我的经理时,他说我不能获得这样做的特权,应该以其他方式查找。
经过几天的研究,我一直回到DBMS_SCHEDULER
,我运气不好或者我的搜索技巧很糟糕。
由于
答案 0 :(得分:3)
我不确定你是否想要使用DBMS_SCHEDULER
;根据我从文档中理解的内容(我自己从未使用过),FTP站点必须对所有人完全开放;有一个参数 destination_permissions ,但它只是“保留供将来使用”,即目前无法指定任何权限。
如果我对此是对的,那么我同意你的经理,但不一定是出于同样的原因(似乎你永远不会获得使用DBMS_SCHEDULER
的许可,我希望这是不正确的。)
还有其他方法可以做到这一点:
UTL_TCP
;这只是一种通过TCP / IP协议进行交互的方法。 Oracle Base has an article,其中包含基于UTL_TCP
的FTP包,并说明如何使用它。这还需要使用UTL_FILE
包,它可以编写OS文件。
UTL_HTTP
;我99%肯定可以用这个连接到FTP;它当然可以连接到SFTP /任何服务器。它需要更多的工作,但从长远来看它是值得的。它还需要使用UTL_FILE
。
直接向FTP存储过程;这可能是最好的方法;使用众多Java FTP libraries中的一个创建一个。
用于调用OS命令的Java存储过程;这是最简单的方法,但最不可扩展。 Oracle在2008年发布了一个white paper来调用PL / SQL中的OS命令,但还有很多其他内容(包括Oracle Base again)
最后,你可以质疑这是否真的是你想做的......
你使用什么调度程序?它是否有事件驱动的调度?如果是这样,就不需要在Oracle内部进行FTP;使用UTL_FILE
将文件写入操作系统,然后从那里写入OS命令。
其他文件原来是在数据库中吗?如果是这种情况,您不需要提取它。您可以使用DBMS_FILE_TRANSFER
直接从数据库中收集它,甚至可以创建JDBC连接或(更简单地)database link来直接选择数据。