从 Oracle 9i 开始,有两种方法可以声明与 UTL_FILE 一起使用的目录。
较旧的方法是设置 INIT.ORA 参数 UTL_FILE_DIR。我们必须重新启动数据库才能使更改生效。该值可以像任何其他 PATH 变量一样;它接受通配符。使用这种方法意味着传递目录路径......
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');
9i 中引入的替代方法是声明一个目录对象。
create or replace directory temp_dir as 'C:\temp'
/
grant read, write on directory temp_dir to vineet
/
目录对象需要确切的文件路径,并且不接受通配符。在这种方法中,我们传递目录对象名称......
UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');
UTL_FILE_DIR 已被弃用,因为它本质上是不安全的 - 所有用户都可以访问路径中指定的所有操作系统目录,而 Directory 对象的读写权限可以单独授予各个用户。此外,使用 Directory 对象,我们可以添加、删除或更改目录,而无需弹回数据库。
无论哪种情况,oracle
操作系统用户必须具有读取和/或写入权限在操作系统目录下。如果不明显,这意味着该目录必须对数据库服务器可见。因此,我们不能使用任何一种方法将本地 PC 上的目录公开给远程数据库服务器上运行的进程。文件必须上传到数据库服务器或共享网络驱动器。
If the oracle
操作系统用户对操作系统目录没有适当的权限,或者如果数据库中指定的路径与实际路径不匹配,程序将抛出此异常:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
此错误的 OERR 文本非常清楚:
29283 - "invalid file operation"
*Cause: An attempt was made to read from a file or directory that does
not exist, or file or directory access was denied by the
operating system.
*Action: Verify file and directory access privileges on the file system,
and if reading, verify that the file exists.
从 Oracle 18c 开始,除了向后兼容性之外,不支持 UTL_FILE_DIR。