Oracle UTL_FILE,如何创建OS目录

2sbarzqh  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(118)

我应该存储一些文件从DB表到服务器目录。存储库树结构应如下所示

\\server\REPOSITORY\[FOLDER]\[list of files...]

其中[文件夹]名称和文件列表从数据库中检索。因此,我使用UTL_FILE工具创建文件

F_OUT := UTL_FILE.FOPEN('\\SERVER\REPOSITORY\FOLDER1', 'FILE1.JPG', 'WB',32760);

但这仅在服务器上已经存在\\SERVER\REPOSITORY\FOLDER1时才有效。如果目录不存在,如何创建目录?(注意,\\SERVER\REPOSITORY\是一个简单的路径,而不是一个Oracle目录)

9gm1akwq

9gm1akwq1#

是的,你可以做到这一点,但它需要一些工作,可能不值得。
方法#1:
1.创建一个C库(.so.dll),其中包含一个函数,该函数将执行目录创建工作,或者 Package 一个对shell脚本的OS调用来执行此操作。在Oracle中将其注册为一个库,并为该函数创建一个外部过程。您需要查看“外部过程”或“extprocs”的文档和示例,以了解详细信息,因为太多了,无法在此说明。
1.可以调用常规存储过程来(a)调用extproc在主机上创建目录,然后(b)使用EXECUTE IMMEDIATE在Oracle中为其创建目录对象并授予所需的权限。
方法#2
1.创建一个外部表并使用PREPROCESSOR属性调用数据库主机上的shell脚本。该shell脚本可以完成目录创建工作,并传回一个虚拟值以使外部表满意。有关“外部表”的详细信息,请参阅相关文档和示例。这感觉像是一个黑客,但它比编写C代码和摆弄extprocs简单。
1.使用存储过程dummy查询这个外部表,这将执行shell脚本。然后让它使用EXECUTE IMMEDIATE在Oracle中为它创建一个目录对象并授予所需的权限。
还有其他选择,但它们变得更加复杂。对于数据库进程来说,从数据库外部到达操作系统层是很困难的。考虑完全重新架构,并从操作系统而不是从数据库中驱动您的流程。这样会更好用此外,它还可以保存您在使用RAC时遇到的麻烦,或者不得不挂载共享存储来克服RAC的多主机特性(您的文件、库和/或脚本必须在任何主机上可用,因为您将在侦听器或作业调度程序连接到您的任何主机上,而不是每次都在同一台主机上)。这是这些方法不常用的主要原因,除了通常需要专门的侦听器和单独的非特权OS帐户来缓解的安全问题。我在这里谈论Unix,我不知道它在Windows上如何工作。
但是你问了,如果你必须从PL/SQL中驱动它,这是一个可行的解决方案。

相关问题